R:在列表中的类似命名列中执行计算

时间:2015-08-27 05:11:02

标签: r

我整晚都在这个墙上撞墙。我有多个数据帧,每个数据帧具有相同的通用列结构。对于每个数据框,列都带有唯一的“_suffix”。数据框中存在匹配的行。这是一个例子:

cat_list <- c("mpg","spd","wt","price")

car <- c("bmw","mbz","lexus","bmw","mbz","lexus")
src <- c("usa","usa","usa","gb","gb","gb")
mpg_usa <- c(5,11,34,0,0,0)
mpg_gb <- c(0,0,0,44,12,9)
spd_usa <- c(55,13,7,0,0,0)
spd_gb <- c(0,0,0,15,43,67)

df <- data.frame(car, src, mpg_usa, mpg_gb, spd_usa, spd_gb)

我想根据我指定的列列表计算匹配行的平均值。例如,我的候选类别列表是cat_list。数据框包含mpgspd。我想计算GB和美国三种车型的平均速度和mpg。

我尝试过几个不同版本的melt但没有成功。我想出了如何使用它来搜索我的列名:

avail.cats <- names(df)[grepl(paste(cat_list, collapse = "|"), names(df))]

然而,这显然无助于我因计算而崩溃。

1 个答案:

答案 0 :(得分:2)

我们可以使用melt的开发版本中的data.table。在我们删除以intersect开头的列名中的子字符串后,我们使用_对“cat_list”中的列名称进行了子集化。将'data.frame'转换为'data.table'(patterns)后,我们可以在measure melt参数中指定多个setDT(df)

library(data.table)#v1.9.5+
nm1 <- intersect(sub('_.*', '', names(df)), cat_list)
dM <- melt(setDT(df), measure=patterns(paste0('^', nm1)), value.name=nm1)

使用melt ed数据集,我们按'car'和'src'进行分组,指定'dM'中与.SDcols中'cat_list'相同的列并使用{{1得到lapply

mean

注意:安装dM[,lapply(.SD, mean) , .(car, src), .SDcols= nm1] # car src mpg spd #1: bmw usa 2.5 27.5 #2: mbz usa 5.5 6.5 #3: lexus usa 17.0 3.5 #4: bmw gb 22.0 7.5 #5: mbz gb 6.0 21.5 #6: lexus gb 4.5 33.5 的devel版本的说明为here