Создание сводной статистики (summarise_all) для большого набора факторных данных с сохранением информации о факторах - PullRequest
0 голосов
/ 29 августа 2018

У меня есть большой набор данных с данными наблюдений, которые я хотел бы агрегировать на уровне страны (также по факторам), чтобы использовать эти данные в качестве данных на уровне страны в другом наборе данных. Один df, который я хотел бы объединить, имеет следующие классы:

character  labelled   numeric 
       24       272        50

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

Я начал следующим образом, который работал довольно хорошо.

dfsum <- df %>%
 group_by(countryyear) %>%
 summarise_all(funs(if(is.numeric(.)) mean(., na.rm = TRUE) else first (.)))

Удивительно, но это оставляет меня с 244/346 переменными (я понятия не имею, почему это будет такое число, любое объяснение было бы замечательно).

Я бы хотел включить в dfsum как можно больше столбцов. Я понимаю, что для неупорядоченных факторов, которые не дают никакой полезной информации, но это будет для упорядоченных факторов. Для бинарных переменных значение между 0 и 1, например, даст мне размер каждой категории, а порядковые переменные часто являются шкалами. Я пытался сделать:

dfsum <- df%>%
 group_by(countryyear) %>%
 summarise_all(funs(if(is.numeric(.)|is.factor(.)) mean(., na.rm = TRUE) else first (.)))

Но это на самом деле ничего не делало (не добавляя никаких дополнительных переменных).

Что еще более важно, я бы хотел, чтобы в процессе обобщения сохранялась информация о факторах. Можно ли каким-то образом прикрепить эту информацию другим способом? Например, чтобы это было двоичное значение (возможно, если более 50% исходной переменной было равно 0 или 1), или добавить шкалу (взяв минимум и максимум исходной переменной)?

1 Ответ

0 голосов
/ 31 августа 2018

Объединив множество других ответов, см. Соответствующие ссылки, мне удалось решить мою проблему следующим образом:

#1
as.numeric.factor <- function(x) {as.numeric(as.character(x))}
#2
df[] = lapply(df, as.numeric.factor)
#3
cols = sapply(df, is.numeric)
cols = names(cols)[cols]
#4
dfsummary = df[, lapply(.SD, mean, na.rm=TRUE), .SDcols = cols, by=countryyear]

1 , 2 , 3 , 4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...