我整晚都在这个墙上撞墙。我有多个数据帧,每个数据帧具有相同的通用列结构。对于每个数据框,列都带有唯一的“_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
。数据框包含mpg
和spd
。我想计算GB和美国三种车型的平均速度和mpg。
我尝试过几个不同版本的melt
但没有成功。我想出了如何使用它来搜索我的列名:
avail.cats <- names(df)[grepl(paste(cat_list, collapse = "|"), names(df))]
然而,这显然无助于我因计算而崩溃。
答案 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