2015-08-27 42 views
1

我一直在這個夜晚一直在我的頭上靠牆。我有多個數據幀,每個數據幀都具有相同的一般列結構。對於每個數據框,列都帶有一個唯一的「_suffix」。數據幀中有匹配的行。這裏是一個例子:R:在列表中的名稱相似的列上執行計算

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和美國的三種車型分別計算平均車速和平均車速。

我試過幾個不同版本的melt沒有成功。我想出瞭如何使用此搜索我的列名稱:

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

但是,這顯然不能幫助我崩潰的計算目的。

回答

2

我們可以使用data.table的開發版本中的melt。在刪除列名中以_開頭的子字符串之後,我們使用intersect對'cat_list'中找到的列名進行子集劃分。我們可以將「data.frame」轉換爲「data.table」(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編集,我們按「車」和「SRC後指定的meltmeasure參數多patterns ',請指定'dM'中與'cat_list'在.SDcols中相同的列,並使用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 

注:以安裝的data.table的開發人員版本是here

+0

啞後續 - 但我怎麼安裝'data.table'的devel的版本?我有1.9.4。 – dra

+0

我覺得這很接近。該代碼確實適用於示例數據,但我認爲它不適合我的需要。在'melt'語句中,'mpg'和'spd'是硬編碼的。我想要做的就是在函數'cat_list'中查找匹配的類別(在這種情況下,它應該找到MPG和SPD,但不是重量或價格)。我有一個很長的類別變量列表,並且它們不會在任何給定的時間出現。數據集中的字段將始終是'cat_list'和(全部)'src'(的一個子集)的置換。 – dra

+0

@dra我根據您的評論更新了帖子。 – akrun