2011-07-07 42 views
1

下面是一個示例:子集R中,加入和計算多次重複

> tmp 
    label value1 value2 
1 aa_x_x xx  xx 
2 bc_x_x xx  xx 
3 aa_x_x xx  xx 
4 bc_x_x xx  xx 

如何計算所有重複標籤的中值(或以上,在其他數據幀列中的相應值的),但是考慮到僅記帳前兩個字母(即「aa_1_1」和「aa_s_3」是相同的值)?標籤列表是有限且可用的。

我看了一下aggregate%in%subsetsubstr,但我無法編譯任何有用而簡單。

這是我希望得到的:

> tmp.result 
    label median1 some.calculation2 
1 aa  xx  xx 
2 bc  xx  xx 
3 aa  xx  xx 
4 bc  xx  xx 

非常感謝你。

回答

5

您是否嘗試過製作新的數據幀 - 我將其稱爲tmp2 - Where tmp2$label==substr(tmp$label,0,2)?從那裏,例如,您可以使用tapply(tmp2$value1,tmp2$label,mean)來計算tmp2$label上聚合的value1的平均值。

使用dplyr

library(dplyr) 
tmp %>% 
    group_by(label=sub('_.*$', '', label)) %>% 
    transmute(median1=median(value1), mean1=mean(value2)) 

或者data.table

library(data.table) 
setDT(tmp)[, c('median1', 'mean1') := list(median(value1), 
    mean1= mean(value2)) , .(label=sub('_.*$', '', label))][, c(1,4:5), 
     with=FALSE] 
+0

謝謝你,傑克的選項。不幸的是,我不明白這個解決方案。順便說一句,我已經更新了你的答覆後的問題... – marw

+0

'tmp2 <-temp; tmp2 $ label <-substr(tmp2 $ label,0,2); median_value_1 <-tapply(tmp2 $ value1,tmp2 $ label,median);' – 2011-07-08 14:08:50

+0

+1彌補我在其他地方的粗魯行爲; P – Mchl