Таблица в r для взвешивания

Я пытаюсь запустить кросс-таблицу / таблицу непредвиденных обстоятельств, но мне нужно, чтобы она была взвешена с помощью весовой переменной. Вот несколько примеров данных.

set.seed(123)
sex <- sample(c("Male", "Female"), 100, replace = TRUE)
age <- sample(c("0-15", "16-29", "30-44", "45+"), 100, replace = TRUE)
wgt <- sample(c(1:10), 100, replace = TRUE)
df <- data.frame(age,sex, wgt)

Я запустил это, чтобы получить обычную таблицу кросс-таблиц

table(df$sex, df$age)

чтобы получить взвешенную частоту, я попробовал пакет Hmisc (если вы знаете пакет получше, дайте мне знать)

library(Hmisc)
wtd.table(df$sex, df$age, weights=df$wgt)
Error in match.arg(type) : 'arg' must be of length 1

Я не уверен, где я ошибся, но он не работает, поэтому любая помощь будет отличной. В качестве альтернативы, если вы знаете, как это сделать в другом пакете, который может быть лучше для анализа данных опроса, это тоже было бы здорово. Спасибо заранее.


person H.Cheung    schedule 06.10.2020    source источник
comment
Чтобы добавить примечание, переменная wgt может иметь десятичные дроби, поэтому для нее потребуется встроенная функция взвешивания. спасибо всем, кто ответил, используя функцию повторения   -  person H.Cheung    schedule 06.10.2020


Ответы (3)


Попробуй это

GDAtools::wtable(df$sex, df$age, w = df$wgt)

Выход

       0-15 16-29 30-44 45+ NA tot
Female   56    73    60  76  0 265
Male     76    99   106  90  0 371
NA        0     0     0   0  0   0
tot     132   172   166 166  0 636

Обновить

Если вы не хотите устанавливать весь пакет, вам понадобятся две важные функции:

wtable и дихотом

Отправьте их, и вы сможете использовать wtable без каких-либо проблем.

person ekoam    schedule 06.10.2020
comment
просто быстрый вопрос, можно ли добавить в это третий уровень. Когда я пытаюсь это сделать, это не работает GDAtools :: wtable (df $ sex, df $ age, df $ VAR3, w = df $ wgt) - когда я создал третью переменную - person H.Cheung; 06.10.2020
comment
Я не думаю, что это работает. Каждый раз можно делать перекрестную таблицу только для двух переменных. - person ekoam; 06.10.2020
comment
не беспокойтесь о 3 уровне. Я не могу написать еще один вопрос. я отредактирую свой другой, спасибо, что ответили на вопрос здесь. всплеск для вас. Благодарность - person H.Cheung; 06.10.2020

Решение состоит в том, чтобы повторить строки data.frame по весу, а затем table результат.

Следующее повторяет строки data.frame (только соответствующие столбцы):

df[rep(row.names(df), df$wgt), 1:2]

И его можно использовать для получения таблицы непредвиденных обстоятельств.

table(df[rep(row.names(df), df$wgt), 1:2])
#       sex
#age     Female Male
#  0-15      56   76
#  16-29     73   99
#  30-44     60  106
#  45+       76   90
person Rui Barradas    schedule 06.10.2020
comment
Спасибо, это отличное решение, но обычно переменная wgt имеет десятичные знаки. Я предполагаю, что функция rep не будет работать, если wgt не является целым числом? - person H.Cheung; 06.10.2020
comment
Это будет работать так же, как и мое, с нецелыми весами. - person Chuck P; 06.10.2020
comment
@Chuck P, он работает с тестовыми данными, но не работает с файлом с более чем 30 тысячами строк данных. Ура, я перепишу свой вопрос. Я не думаю, что репутация эффективна - person H.Cheung; 06.10.2020
comment
это слишком медленно, это заняло около 6 минут. Репутация не эффективна. мои строки большие 30k +, а значения wgt большие 3000-7000. это похоже на физическую копию образца. Мои данные взвешены по населению, поэтому они будут реплицировать строки до 50 м? Я бы предпочел использовать другое решение, чем преобразовывать вес, чтобы затем преобразовать число обратно, но еще раз спасибо - person H.Cheung; 06.10.2020
comment
@ H.Cheung Если скорость является проблемой, решение @ ekoam GDAtools::wtable является самым быстрым. - person Rui Barradas; 06.10.2020
comment
@Rui, пакет не установился. Я уже задавал другой вопрос и перефразировал его, чтобы было понятнее. Ваш код с Rep, я думаю, будет мне полезен в других обстоятельствах. спасибо за вашу помощь сегодня. - person H.Cheung; 06.10.2020
comment
@ H.Cheung Имя пакета в ответе неверное, оно в нижнем регистре t: GDAtools. И он устанавливается после этого исправления. - person Rui Barradas; 06.10.2020
comment
@ H.Cheung В моих тестах GDAtools::wtable был в 140 и 180 раз быстрее, чем Чак Пи и мои решения соответственно. У df был вес от 3000 до 5000. - person Rui Barradas; 06.10.2020

Решение tidyverse с использованием ваших данных из набора set.seed, uncount эквивалентно rep весам @ Rui.

library(dplyr)
library(tidyr)

df %>%
   uncount(weights = .$wgt) %>% 
   select(-wgt) %>%
   table
#>        sex
#> age     Female Male
#>   0-15      56   76
#>   16-29     73   99
#>   30-44     60  106
#>   45+       76   90
person Chuck P    schedule 06.10.2020
comment
если это так, будет ли это работать, если значения переменной wgt не являются целыми числами? Извините, я должен был создать случайный wgt с десятичными знаками - person H.Cheung; 06.10.2020
comment
да. Я использовал wgt <- runif(100, min = .5, max = 20) для тестирования, и он отлично справился - person Chuck P; 06.10.2020