Как рассчитать среднее значение строк по выбранным столбцам

#r #row #apply #average

#r #ряд #применять #средний

Вопрос:

У меня есть фрейм данных, который выглядит так:

 data lt;- as.data.frame(cbind('01-01-2018' = c(1.2,3.1,0.7,-0.3,2.0), '02-01-2018' = c(-0.1, 2.4, 4.9,-3.3,-2.7), '03-01-2018' = c(3.4, -2.6, -1.8, 0.1, 0.3)))   01-01-2018 02-01-2018 03-01-2018 1 1.2 -0.1 3.4 2 3.1 2.4 -2.6 3 0.7 4.9 -1.8 4 -0.3 -3.3 0.1 5 2.0 -2.7 0.3  

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

 data$mn lt;- apply(data, 1, mean)    01-01-2018 02-01-2018 03-01-2018 mn 1 1.2 -0.1 3.4 1.5000000 2 3.1 2.4 -2.6 0.9666667 3 0.7 4.9 -1.8 1.2666667 4 -0.3 -3.3 0.1 -1.1666667 5 2.0 -2.7 0.3 -0.1333333   

Другими словами, для каждой строки я хочу рассчитать среднее значение значений, которые превышают data$mn .

Моя последняя попытка была:

 data$mintensity lt;- apply(data, 1, function(x) mean(x[x gt; data$mn]) )   

но это было безуспешно.

Ответ №1:

Просто подмножьте каждую строку по их средствам в соответствующих строках w , прежде чем вычислять их средние значения.

 w lt;- c("01-01-2018", "02-01-2018", "03-01-2018") ## define columns  apply(data[, w], 1, function(x) mean(x[x gt; mean(x)])) # [1] 3.40 2.75 4.90 -0.10 1.15  

Другой способ replace -использовать точки данных, которые не превышают средние значения строк NA's перед вычислением rowMeans . Это примерно в 30 раз быстрее.

 rowMeans(replace(data, data lt;= rowMeans(data[, w]), NA), na.rm=TRUE) # [1] 3.40 2.75 4.90 -0.10 1.15  

Данные:

 data lt;- structure(list(`01-01-2018` = c(1.2, 3.1, 0.7, -0.3, 2), `02-01-2018` = c(-0.1,  2.4, 4.9, -3.3, -2.7), `03-01-2018` = c(3.4, -2.6, -1.8, 0.1,  0.3)), class = "data.frame", row.names = c(NA, -5L))  

Комментарии:

1. Да, хорошо. Однако я должен применить ту же строку и к другим двум столбцам, которые не являются = data$mn и не могут быть синтезированы с помощью простой формулы, такой как mean(x)

2. @nflore Смотрите обновление, пожалуйста.