У меня есть список из трех фреймов данных, и я хотел бы создать еще один список из трех фреймов данных, строки которого состоят из каждого из значений группирующей переменной (g1) и среднего значения шести переменных по переменной g1. Суть в том, что я хотел бы вычислять средние значения для трех непрерывных переменных только тогда, когда значение соответствующей фиктивной переменной равно 1.
Воспроизводимый пример:
a <- data.frame(c("fj","fj","fj","a","fj","a","g","g","g","g"),c(1,1,1,1,0,0,0,1,0,0),c(0,0,1,0,1,0,0,1,0,1),c(0,0,0,1,0,0,1,1,0,0),floor(runif(10, min = 10, max = 200)),floor(runif(10, min = 10, max = 200)),floor(runif(10, min = 10, max = 200)))
b <- data.frame(c("fj","a","fj","a","fj","fj","fj","g","g","g"),floor(runif(10, min = 0, max = 2)),floor(runif(10, min = 0, max = 2)),floor(runif(10, min = 0, max = 2)),floor(runif(10, min = 10, max = 200)),floor(runif(10, min = 10, max = 200)),floor(runif(10, min = 10, max = 200)))
c <- data.frame(c("fj","fj","fj","a","fj","a","g","g","g","g"),floor(runif(10, min = 0, max = 2)),floor(runif(10, min = 0, max = 2)),floor(runif(10, min = 0, max = 2)),floor(runif(10, min = 10, max = 200)),floor(runif(10, min = 10, max = 200)),floor(runif(10, min = 10, max = 200)))
u <- list(a,b,c)
u <- lapply(u, setNames, nm = c('g1','dummy1','dummy2','dummy3','contin1','contin2','contin3'))
u[[1]]
> u
[[1]]
g1 dummy1 dummy2 dummy3 contin1 contin2 contin3
1 fj 1 0 0 199 18 61
2 fj 1 0 0 91 158 28
3 fj 1 1 0 147 67 190
4 a 1 0 1 181 105 22
5 fj 0 1 0 14 16 156
6 a 0 0 0 178 14 98
7 g 0 0 1 116 97 30
8 g 1 1 1 48 31 144
9 g 0 0 0 60 21 112
10 g 0 1 0 95 145 199
Я хотел бы вычислить среднее значение contin1 только при dummy1 = 1, среднее значение contin2 только при dummy2 = 1 и среднее значение contin3 только при dummy3 = 1
Вывод, который я ХОЧУ для первого списка:
> rates
[[1]]
x[, 1] V1 V2 V3 x[, 1] x[, 6] x[, 1] x[, 7] x[, 1] x[, 8]
1 a 0.50 0.0 0.5 a 181 a NA a 22
2 fj 0.75 0.5 0.0 fj 145.67 fj 41.5 fj NA
3 g 0.25 0.5 0.5 g 48 g 88 g 87
Что я пробовал:
rates <- lapply(u, function(x) {
cbind(aggregate(cbind(x[,2],x[,3],x[,4]) ~ x[,1], FUN = mean, na.action = NULL),
aggregate(x[,6] ~ x[,1], FUN = mean, na.action = NULL, subset = (x[,2] == 1)),
aggregate(x[,7] ~ x[,1], FUN = mean, na.action = NULL, subset = (x[,3] == 1)),
aggregate(x[,8] ~ x[,1], FUN = mean, na.action = NULL, subset = (x[,4] == 1)))
})
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 3, 2
Я понимаю, что эта ошибка исходит от cbind, потому что cbind терпит неудачу всякий раз, когда вы пытаетесь связать объекты с разным количеством строк. (Столбец x[, 6] имеет три строки, а x[, 7] и x[, 8] — две.) Наверное, я надеялся, что у агрегата есть какой-то способ сохранить одну строку для каждой группирующей переменной, что означало бы что у меня будет такое же количество строк, и cbind будет работать. Возможно, это невозможно в соответствии с документацией R?: «Строки с отсутствующими значениями в любой из переменных by будут исключены из результата».
Я внимательно прочитал документацию по агрегату. В следующих двух сообщениях рассматриваются аналогичные вопросы, но не используются разные подмножества данных для расчета средних значений.
R: вычислить средства для подмножества группы и Средства из списка фреймов данных в R
Любые предложения будут очень признательны.