2012-07-24 108 views
1

用於數據幀作爲遵循ř求和樞軸表

id<-c(1,1,2,3,3,2) 
p<-c(10,0,22,34,0,0) 
df<-data.frame(id,p) 

我需要像

id p 
1 10 
2 22 
3 34 

這實際上是聚集P的總和爲每個ID的彙總表。 我可以用'dcast'得到這個嗎?

+0

注「)'。相反,你已經創建了一個有兩個字符串的向量。 – A5C1D2H2I1M1N2O1R2T1 2012-07-24 09:24:47

+0

@mrdwab:是的,我剛糾正它。我打算創建一個數據框 – AliCivil 2012-07-24 11:32:34

回答

3

爲什麼你需要dcast?嘗試aggregate在基礎R:

df <- data.frame(id = c(1,1,2,3,3,2), 
       p = c(10,0,22,34,0,0)) 
aggregate(df, by=list(id), sum) 
# Group.1 id p 
# 1  1 2 10 
# 2  2 4 22 
# 3  3 6 34 

您也可以欺騙dcast如下。您的數據是不完全在預期的「熔融」形式dcast

library(reshape2) 
dcast(df, id ~ ., value.var = "p", sum) 
# id NA 
# 1 1 10 
# 2 2 22 
# 3 3 34 
+2

對輸出(colnames)只做了一點改進: 'aggregate(list(p = df $ p),by = list(id = df $ id),sum)' – Alan 2012-07-24 09:44:39

+0

@Alan,是的,這是更好看的輸出。 – A5C1D2H2I1M1N2O1R2T1 2012-07-24 09:47:21

5

有多種方法以獲得所需的結果,這裏有幾個: 你可以使用splitsapply

df <- data.frame(id, p) 
sapply(split(df, df$id), function(x) sum(x$p)) 
1 2 3 
10 22 34 

或者與tapply短了很多:

tapply(p, id, sum) 
1 2 3 
10 22 34 

或者你可以使用ddplyplyr包:

library(plyr) 
ddply(df, .(id), function(x) sum(x$p)) 
    id V1 
1 1 10 
2 2 22 
3 3 34 

最後,您還可以使用by:您尚未創建`data.frame`用`DF = C( 「ID」,「P

by(p, id, sum) 
id: 1 
[1] 10 
------------------------------------------------------------ 
id: 2 
[1] 22 
------------------------------------------------------------ 
id: 3 
[1] 34