Как изменить среднее значение определенных строк во фрейме данных

Я хотел бы создать новый столбец, равный среднему значению нескольких переменных (столбцов) в моем фрейме данных. Однако я боюсь, что не могу использовать rowMeans, потому что не хочу усреднять все переменные. Более того, я не решаюсь вручную вводить все имена переменных (а их много). Например:

my_data <- data.frame(a = c(1,2,3), b = c(4,5,6), c = c(10,10,10), d = c(13,24,81),
                      e = c(10, 8, 6), hello = c(1,-1,1), bye = c(1,5,5))

Я хочу изменить строку с именем avg, которая представляет собой среднее значение только переменных a, b, c, d и e. Поскольку в моем наборе данных имена переменных длинные (и сложные) и их больше 10, я предпочитаю не вводить их по одной. Итак, я думаю, мне может понадобиться использовать пакет dplyr и функцию изменения ?? Не могли бы вы подсказать мне, как это сделать?

Приведенный ниже контент добавлен после ваших добрых комментариев и ответов. Еще раз спасибо всем:

На самом деле мне нужны имена столбцов: Mcheck5

my_data <- data.frame(a = c(1,2,3), b = c(4,5,6), c = c(10,10,10), d = c(13,24,81),
                      e = c(10, 8, 6), hello = c(1,-1,1), bye = c(1,5,5))
1, Mcheck5my_data$avg = rowMeans(select(my_data, Mcheck5_1_1:Mcheck5_8_1), na.rm = TRUE)1, ..., Mcheck5_8_1 (всего их 8). Однако я попробовал my_data$avg = rowMeans(select(my_data, Mcheck5_1_1:Mcheck5_8_1), na.rm = TRUE), но мне выдали ошибку:

Error in select(my_data, Mcheck5_1_1:Mcheck5_8_1) : 
unused argument (Mcheck5_1_1:Mcheck5_8_1)

Прямо сейчас я решил проблему, используя следующий код:

`idx = grep("Mcheck5_1_1", names(my_data))
my_data$avg = rowMeans(my_data[, idx:idx+7], na.rm = TRUE)`

Но есть ли более элегантный способ сделать это? Или почему я не мог использовать select()? Спасибо!


person JetLag    schedule 08.10.2017    source источник
comment
По крайней мере, вам понадобится какое-то правило, чтобы получить нужные вам переменные.   -  person Axeman    schedule 08.10.2017
comment
dplyr не обязательно нужен, достаточно my_data$rowmn <- rowMeans(my_data[,1:5]); или в dplyr: my_data %>% mutate(rowmn = rowMeans(.[1:5]))   -  person Jaap    schedule 08.10.2017
comment
Вы предоставляете пример data.frame. Могли бы вы использовать его для получения ожидаемого результата? Я не понимаю, что именно вы хотите.   -  person CPak    schedule 08.10.2017
comment
Дорогой Яап, Большое спасибо за ответ. Имена переменных от Mcheck5_1_1 до Mcheck5_8_1. Да, я мог бы проиндексировать переменную с помощью функции grep, и я точно знаю, сколько переменных мне нужно агрегировать. Однако я думал о чем-то вроде Mcheck5_1_1: Mcheck5_8_1. Возможно ли это сделать? Большое спасибо!   -  person JetLag    schedule 08.10.2017
comment
Что устанавливает переменные, которые вы хотите включить, помимо тех, которые вы хотите исключить? имена столбцов? класс столбца? Положение столбца? что-то другое? Без этой информации невозможно ответить на ваш вопрос. Как только вы это узнаете, будет относительно легко достичь того, что вы хотите делать с помощью подмножества или dplyr :: select_helpers   -  person NiclasRudolfson    schedule 08.10.2017
comment
Добавил свою ошибку, спасибо за совет NiclasRudolfson   -  person JetLag    schedule 08.10.2017


Ответы (1)


Я бы сделал что-то вроде этого

my_data <- data.frame(a = c(1,2,3), b = c(4,5,6), c = c(10,10,10), d = c(13,24,81),
                      e = c(10, 8, 6), hello = c(1,-1,1), bye = c(1,5,5))

several_variables <- c('a', 'b', 'c', 'd', 'e') #3 or `letters[1:5]`
my_data$avg <- rowMeans(my_data[,several_variables])
my_data
#>   a b  c  d  e hello bye  avg
#> 1 1 4 10 13 10     1   1  7.6
#> 2 2 5 10 24  8    -1   5  9.8
#> 3 3 6 10 81  6     1   5 21.2

Очевидно, что если переменные находятся в каком-то фиксированном положении, и вы знаете, что они останутся там, вы можете использовать нумерованную индексацию как предложено Яапом,

my_data$avg <- rowMeans(my_data[,1:5])
person Eric Fail    schedule 08.10.2017