Создание нового столбца, который является средним числом несмежных строк во фрейме данных - PullRequest
0 голосов
/ 02 февраля 2019

Я очень плохо знаком с R. У меня есть несколько столбцов переменных, относящихся к различным ответам на вопросы в вопроснике.Я хочу создать новый столбец во фрейме данных, который является средним из набора этих предыдущих переменных.Я видел, что для этого можно использовать rowMeans, но, похоже, это работает только для соседних столбцов, но столбцы, которые я хочу усреднить, не являются соседними.Я также хочу иметь некоторый контроль над тем, как обрабатываются недостающие данные.Я создал пример данных, используя

Var1<- c(1.5, 2.3, NA, NA, 2.3, 3.3)
Var2<- c(1.7, 2.2, 4.7, 13.3, 1.7, 1.5)
Var3<- c(5.1, 6.7, 3.4, 5.5, NA, 8.7)
Var4<- c(4.5, 5.4, NA, 4.5, 5.4, 8.9)

, что дает

  Var1 Var2 Var3 Var4
1  1.5  1.7  5.1  4.5
2  2.3  2.2  6.7  5.4
3  NA   4.7  3.4  NA
4  NA   13.3  5.5  4.5
5  2.3  1.7  NA  5.4
6  3.3  1.5  8.7  8.9

Поэтому я хочу создать новый столбец или переменную в этом фрейме данных, который представляет собой среднее значение Var1, Var2 и Var4 (но не Вар3).Я также хочу, чтобы он по-прежнему отображал среднее значение оставшихся данных, если данные для одной из переменных отсутствуют, но я хочу, чтобы он возвращал NA в новом столбце, если отсутствуют данные для двух столбцов.Таким образом, для человека 3 новый столбец будет NA, но для человека 4 и 5 будет получено среднее значение доступных значений в трех столбцах.

Я надеюсь, что это имеет смысл, любая помощь очень ценится

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Учитывая ..

df1 <- data.frame(Var1, Var2, Var3, Var4)

Одной строкой будет решение ..

df1$newCol <- apply(df1[,-3],1,function(x){ifelse(sum(is.na(x))>1,NA,mean(x,na.rm=T))})
0 голосов
/ 02 февраля 2019

Мы можем использовать rowSums, чтобы проверить число NA с для выбранных столбцов путем подмножества набора данных.Если оно больше 1, верните NA или еще 1. Затем с помощью rowMeans получите mean строк для выбранных столбцов и измените те строки, которые имеют более 1 NA, на NA

# column index 
ind <- c(1, 2, 4)    
i1 <- NA^(rowSums(is.na(df1[ind])) > 1)
df1$newCol <- rowMeans(df1[ind], na.rm = TRUE) * i1

данные

df1 <- data.frame(Var1, Var2, Var3, Var4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...