фрейм данных взвешенной таблицы с plyr

Я работаю с данными опроса, состоящими из целочисленных ответов на несколько вопросов (y1, y2, y3, ...) и взвешенного количества, назначенного каждому респонденту, например:

foo <- data.frame(wcount = c(10, 1, 2, 3),        # weighted counts
                  y1 = sample(1:5, 4, replace=T), # numeric responses
                  y2 = sample(1:5, 4, replace=T), #
                  y3 = sample(1:5, 4, replace=T)) #
>foo
  wcount y1 y2 y3
1     10  5  5  5
2      1  1  4  4
3      2  1  2  5
4      3  2  5  3

и я хотел бы преобразовать это в консолидированную версию фрейма данных взвешенной таблицы, в которой первый столбец представляет значения ответа, а следующие 3 столбца представляют взвешенные числа. Это можно сделать явно по столбцу, используя:

library(Hmisc)
ty1 <- wtd.table(foo$y1, foo$wcount)
ty2 <- wtd.table(foo$y2, foo$wcount)
ty3 <- wtd.table(foo$y3, foo$wcount)

bar <- merge(ty1, ty2, all=T, by="x")
bar <- merge(bar, ty3, all=T, by="x")

names(bar) <- c("x", "ty1", "ty2", "ty3")
bar[is.na(bar)]<-0
>bar
  x ty1 ty2 ty3
1 1   3   0   0
2 2   3   2   0
3 3   0   0   3
4 4   0   1   1
5 5  10  13  12

Я подозреваю, что есть способ автоматизировать это с помощью plyr и numcolwise или ddply. Например, примерно следующее, но я не уверен, что еще нужно для завершения работы:

library(plyr)
bar2 <- numcolwise(wtd.table)(foo[c("y1","y2","y3")], foo$wcount)
>bar2
        y1       y2       y3
1  1, 2, 5  2, 4, 5  3, 4, 5
2 3, 3, 10 2, 1, 13 3, 1, 12

Есть предположения?


person Bryan    schedule 03.10.2014    source источник
comment
привет, с каким опросом вы работаете? это похоже на множественное вменение, которому нужны пакеты mitools + survey, чтобы получить правильные доверительные интервалы.   -  person Anthony Damico    schedule 04.10.2014
comment
Я работаю с Обследованием потребления энергии в жилищном секторе США (RECS), среди прочего, от EIA. Приятно видеть, что есть пакет практически для всего, спасибо за ссылки!   -  person Bryan    schedule 04.10.2014
comment
это просто опрос, основанный на репликации. вы пытаетесь заново изобрести колесо ... вам будет намного легче копируя их официальные методы, если вы используете пакет опроса. :)   -  person Anthony Damico    schedule 04.10.2014
comment
Вот что происходит, когда невежественный инженер пытается решить то, что выглядит как основная проблема в другой дисциплине, о существовании которой он не знал. Спасибо за просветление! Похоже, мне нужно еще много почитать.   -  person Bryan    schedule 04.10.2014


Ответы (2)


Это не ответ plyr, но мне показалось, что это проблема преобразования / агрегирования, которую можно решить, просто используя функции из пакета reshape2.

Сначала melt набор данных, создавая столбец значения ответа, который можно назвать x (уникальные значения в _3 _-_ 4_).

library(reshape2)
dat2 = melt(foo, id.var = "wcount", value.name = "x")

Теперь это можно отбросить назад с помощью dcast, используя sum в качестве функции агрегирования. Это возвращает _8 _-_ 9_ в виде столбцов с суммой wcount для каждого значения x.

# Cast back wide using the values within y1-y3 as response values
    # and filling with the sum of "wcount"
dcast(dat2, x ~ variable, value.var = "wcount", fun = sum)

Давая

  x y1 y2 y3
1 1  3  0  0
2 2  3  2  0
3 3  0  0  3
4 4  0  1  1
5 5 10 13 12
person aosmith    schedule 03.10.2014
comment
Это отлично работает, спасибо! Я всегда использую melt, но я новичок в кастинге, так что это было очень полезно. В учебных целях мне все еще интересно понять, можно ли / как этого достичь с помощью ddply, а если нет, то почему. - person Bryan; 04.10.2014

вы описываете набор данных обследования, в котором используются дублирующие веса. см. http://asdfree.com/ для многих, многих примеров, но для рекомендаций сделайте что-то вроде этого:

library(survey)

x <- read.csv( "http://www.eia.gov/consumption/residential/data/2009/csv/recs2009_public.csv" )
rw <- read.csv( "http://www.eia.gov/consumption/residential/data/2009/csv/recs2009_public_repweights.csv" )
y <- merge( x , rw )

# create a replicate-weighted survey design object
z <- svrepdesign( data = y , weights = ~NWEIGHT , repweights = "brr_weight_[0-9]" )

# now run all of your analyses on the object `z` ..
# see the `survey` package homepage for details

# distribution
svymean( ~ factor( BASEHEAT ) , z )

# mean
svymean( ~ TOTHSQFT , z )
person Anthony Damico    schedule 04.10.2014
comment
Спасибо за пример! FWIW, моя конечная цель - не найти сводную статистику с CI, а скорее изучить распределения нескольких непрерывных откликов (например, настроек температуры) с использованием взвешенных гистограмм и взвешенных эмпирических графиков cdf в решетке, которая не поддерживает веса (кроме графика плотности ), поэтому мне пришлось немного переформатировать данные, чтобы показать то, что я хочу. Survey предлагает некоторые из этих функций, но я предпочитаю возможности обработки нескольких панелей для построения решетчатых графиков. Придется потратить некоторое время на то, чтобы поиграть с опросом, чтобы увидеть, могут ли / как они могут работать вместе. - person Bryan; 04.10.2014