根据另一列中的值汇总一列中的数据

Cod*_*Guy 11 aggregate r dataframe

我知道有一种简单的方法可以做到这一点......但是,我无法弄明白.

我的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
Run Code Online (Sandbox Code Playgroud)

请注意,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]
Run Code Online (Sandbox Code Playgroud)

有什么简单的方法吗?我基本上想要得到一个如下所示的数据框:

    A     num     totalB
   1.2    3       12
   etc    etc     etc
Run Code Online (Sandbox Code Playgroud)

其中"num"是特定A值出现的次数,"totalB"是给定A值的B值之和.

NPE*_*NPE 19

我用它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
Run Code Online (Sandbox Code Playgroud)


lee*_*sej 6

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))
Run Code Online (Sandbox Code Playgroud)


Ram*_*ath 5

这是使用plyr包装的解决方案

plyr::ddply(df, .(A), summarize, num = length(A), totalB = sum(B))
Run Code Online (Sandbox Code Playgroud)


mne*_*nel 5

这是data.table用于内存和时间效率的解决方案

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

仅对行进行子集化C==1 (根据对@aix 答案的评论)

DT[C==1, list(totalB = sum(B), num = .N), by = A]
Run Code Online (Sandbox Code Playgroud)