在R中同时取相似命名列的平均值

在R中同时取相似命名列的平均值,r,dataframe,lapply,R,Dataframe,Lapply,在下面的my data.frame中,除了前两列(person\u id和gender),列名已按名称分组。例如,audio\u vocab列为7列:audio\u vocab\u 01,…,audio\u vocab\u 07 我想知道如何在我的data.frame中取这些类似命名列的平均值,并替换其所有组成列的结果列(例如,代替原来的7个audio\u vocab列,只需要一个audio\u vocab\u mean列) 如何一次对所有类似名称的列执行此操作 w2 <- read.cs

在下面的my data.frame中,除了前两列(
person\u id
gender
),列名已按名称分组。例如,
audio\u vocab
列为7列:
audio\u vocab\u 01
,…,
audio\u vocab\u 07

我想知道如何在我的data.frame中取这些类似命名列的平均值,并替换其所有组成列的结果列(例如,代替原来的7个
audio\u vocab
列,只需要一个
audio\u vocab\u mean
列)

如何一次对所有类似名称的列执行此操作

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

w2我们可以使用
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
#...

cols我们可以通过提取前缀部分循环
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)))

un1适合您吗?@Reza可能您可以使用
面板
,因为在我的问题中,相同的独立曲线被添加到xyplot,即challange!我对任何其他软件包开放?@Reza可能是您需要的
,如中所示