2011-09-26 237 views
8

我知道有一種簡單的方法可以做到這一點......但是,我無法弄清楚。基於另一列中的值在一列中聚合數據

我有我的[R腳本中的數據幀,看起來是這樣的:

A  B C 
1.2 4 8 
2.3 4 9 
2.3 6 0 
1.2 3 3 
3.4 2 1 
1.2 5 1 

需要注意的是A,B和C是列名。我試圖得到這樣的變量:

sum1 <- [the sum of all B values such that A is 1.2] 
num1 <- [the number of times A is 1.2] 

任何簡單的方法來做到這一點? 我基本上想用一個數據幀,看起來像這樣結束了:

A  num  totalB 
    1.2 3  12 
    etc etc  etc 

其中「NUM」次是特定的值出現的數量,而「共計b」是B值的獲得的款項A值。

回答

13

我最好使用aggregate獲得兩個聚集體,然後將它們merge成單個數據幀:

> df 
    A B C 
1 1.2 4 8 
2 2.3 4 9 
3 2.3 6 0 
4 1.2 3 3 
5 3.4 2 1 
6 1.2 5 1 

> num <- aggregate(B~A,df,length) 
> names(num)[2] <- 'num' 

> totalB <- aggregate(B~A,df,sum) 
> names(totalB)[2] <- 'totalB' 

> merge(num,totalB) 
    A num totalB 
1 1.2 3  12 
2 2.3 2  10 
3 3.4 1  2 
+0

在總體上,它只是使用中的所有行我的數據幀。如果我想說只聚合一個特定行的特定條件(例如,當c == 1) – CodeGuy

+0

@CodeGuy:只是「子集」它,例如'骨料(B〜A,子集(DF,C == 1),總和)' – NPE

4

下面是使用plyr

plyr::ddply(df, .(A), summarize, num = length(A), totalB = sum(B)) 
4

這裏的溶液爲溶液使用data.table作爲內存和時間效率

library(data.table) 
DT <- as.data.table(df) 
DT[, list(totalB = sum(B), num = .N), by = A] 

到子集僅排在那裏C==1(按照註釋@aix答案)

DT[C==1, list(totalB = sum(B), num = .N), by = A] 
1

dplyr

library(tidyverse) 
A <- c(1.2, 2.3, 2.3, 1.2, 3.4, 1.2) 
B <- c(4, 4, 6, 3, 2, 5) 
C <- c(8, 9, 0, 3, 1, 1) 

df <- data_frame(A, B, C) 

df %>% 
    group_by(A) %>% 
    summarise(num = n(), 
       totalB = sum(B)) 
相關問題