Возьмите среднее значение столбцов с одинаковыми именами сразу в R - PullRequest
2 голосов
/ 04 мая 2020

В моем data.frame ниже, кроме первых двух столбцов (person_id и gender), имена столбцов сгруппированы по именам. Например, столбцы audio_vocab представляют собой 7 столбцов: audio_vocab_01, ..., audio_vocab_07.

Мне было интересно, как я могу взять среднее значение этих столбцов с одинаковыми именами в моем data.frame и замените результирующий столбец для всех составляющих его столбцов (например, вместо исходных 7 audio_vocab столбцов нужен только один audio_vocab_mean столбец).

Как я могу сделать это для всех моих одноименных столбцов одновременно?

w2 <- read.csv('https://raw.githubusercontent.com/izeh/n/master/w2.csv', stringsAsFactors = F) 

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

Мы можем использовать split.default, чтобы разделить одинаковые именованные столбцы и взять их среднее по строке.

cols <- 1:2
temp <- w2[-cols]
cbind(w2[cols], sapply(split.default(temp, 
                   sub('_\\d+', '', names(temp))), rowMeans, na.rm = TRUE))


#  person_id gender audio_vocab ctest dictation elicited_speech text_vocab
#1         1   MALE       0.837 0.800    0.5011           0.866      0.877
#2         2   MALE       0.909 0.957    0.7348           0.926      0.937
#3         3 FEMALE       0.826 0.737    0.5179           0.771      0.711
#4         4 FEMALE       0.775 0.591    0.5735           0.645      0.736
#5         5   MALE       0.473 0.548    0.0117           0.737      0.704
#6         6  OTHER       0.635 0.729    0.4294           0.669      0.852
#...
1 голос
/ 04 мая 2020

Мы можем l oop над именами столбцов unique, извлекая префиксную часть и получая rowMeans

un1 <- unique(sub("_\\d+$", "", names(w2)[-(1:2)]))
out <- cbind(w2[1:2], do.call(cbind, setNames(lapply(un1, 
       function(nm) rowMeans(w2[startsWith(names(w2), nm)], na.rm = TRUE)), un1)))
...