R как усреднить данные датасета построчно?
Всем привет! Прошу помочь с оптимизацией кода для обработки данных датасета. Условно говоря у меня есть следующая таблица (числа рандомные):
[Lam_F2_2_100 Lam_F2_2_101 Lam_F2_2_102 Bol_1_144 Bol_1_175 Bol_1_197]
[1544.0017212 74572.992545 14752.007148 475863.9912 48975.13584 475645.2135]
[4758.4752743 74172.992824 74172.007170 7427.996145 489765.1564 979865.1235]
Здесь у меня две группы испытуемых, у которых трижды проводили опрос. Мне нужно для каждой группы посчитать среднее результатов опросов, чтобы в конечном итоге осталась таблица из двух столбцов:
[Lam_F2 Blank_1]
[14754.002 87572.992545]
[57858.475 75172.992824]
Я написал цикл, который считает среднее сначала двух опросов одной группы, и записывает результат в первый опрос. Потом второй цикл, который считает среднее третьего и нового первого опроса, и записывает результаты снова в первый опрос. Потом удаляю лишние столбы Lam_F2_2_101 и Lam_F2_2_102. И так для каждой группы. А их у меня не две, а семь.
if ((df$Lam_F2_2_100[i] != 0 & df$Lam_F2_2_101[i] != 0)){
if (abs(df$Lam_F2_2_100[i] - df$Lam_F2_2_101[i]) <= mean(c(df$Lam_F2_2_100[i], df$Lam_F2_2_101[i]))){
df$Lam_F2_2_100[i] <- mean(c(df$Lam_F2_2_100[i], df$Lam_F2_2_101[i]))
} else df$Lam_F2_2_100[i] <- max(df$Lam_F2_2_100[i],df$Lam_F2_2_101[i])
} else df$Lam_F2_2_100[i] <- (df$Lam_F2_2_100[i] + df$Lam_F2_2_101[i])
}
for (i in 1:nrow(df)){
if ((df$Lam_F2_2_100[i] != 0 & df$Lam_F2_2_102[i] != 0)){
if (abs(df$Lam_F2_2_100[i] - df$Lam_F2_2_102[i]) <= mean(c(df$Lam_F2_2_100[i], df$Lam_F2_2_102[i]))){
df$Lam_F2_2_100[i] <- mean(c(df$Lam_F2_2_100[i], df$Lam_F2_2_102[i]))
} else df$Lam_F2_2_100[i] <- max(df$Lam_F2_2_100[i],df$Lam_F2_2_102[i])
} else df$Lam_F2_2_100[i] <- (df$Lam_F2_2_100[i] + df$Lam_F2_2_102[i])
}
Вопрос: можно ли объединить это всё в один-два больших цикла? Может можно сделать такой цикл, который будет сравнивать названия столбов, и если часть названия похожа, то он их усредняет? Или может я вообще какой-то ерундой страдаю, и всё можно сделать проще?
Ответы (2 шт):
Можно проще. Как вариант - почитайте описание функций summarise (пакет dplyr) и transpose (purrr). Первый цикл можно заменить так:
summarise_all(mtcars, funs(mean))
Предположим, что массив с данными называется array. Тогда среднее по сумме столбцов Lam_F2_2_100, Lam_F2_2_101 и Lam_F2_2_102 в массив ans получается вот так:
library(data.table)
array <- as.data.table(array)
array$Lam_F2_2_100 <- as.numeric(array$Lam_F2_2_100)
array$Lam_F2_2_101 <- as.numeric(array$Lam_F2_2_101)
array$Lam_F2_2_102 <- as.numeric(array$Lam_F2_2_102)
ans <- array[, .(Lam_F2 = mean(sum(Lam_F2_2_100 , Lam_F2_2_101 , Lam_F2_2_102 )))]
Аналогичным образом, меняя столбцы внутри функции sum(), получается среднее по сумме любых столбцов.