R-折叠行并对列中的值求和

R-折叠行并对列中的值求和,r,unique,aggregate,rows,collapse,R,Unique,Aggregate,Rows,Collapse,我有以下数据帧(df1): 我想折叠第一列并添加相应的PSM值 我希望得到以下输出: ID Sum PSM ABC 2 CCC 58 DDD 56 EEE 80 FFF 1 GGG 90 KOO 45 LLL 4 ZZZ 8 使用聚合函数似乎可行,但不知道语法。 非常感谢您的帮助!谢谢。使用plyr软件包非常简单: library(plyr) ddply(df1, .(ID), summarize, Sum=sum(PSM)) 基本上: aggregate(PSM ~ ID, data=x

我有以下数据帧(df1):

我想折叠第一列并添加相应的PSM值 我希望得到以下输出:

ID  Sum PSM
ABC 2
CCC 58
DDD 56
EEE 80
FFF 1
GGG 90
KOO 45
LLL 4
ZZZ 8
使用聚合函数似乎可行,但不知道语法。
非常感谢您的帮助!谢谢。

使用
plyr
软件包非常简单:

library(plyr)
ddply(df1, .(ID), summarize, Sum=sum(PSM))
基本上:

aggregate(PSM ~ ID, data=x, FUN=sum)
##    ID PSM
## 1 ABC   2
## 2 CCC  58
## 3 DDD  56
## 4 EEE  80
## 5 FFF   1
## 6 GGG  90
## 7 KOO  45
## 8 LLL   4
## 9 ZZZ   8

使用dplyr的示例,plyr的下一次迭代:

df2 <- df1 %>% group_by(ID) %>%
     summarize(Sum_PSM = sum(PSM))
df2%分组依据(ID)%>%
总结(总结=总结)

当您输入字符
%%>%%
时,您就是“管道”。这意味着您正在输入管道操作符左侧的内容并执行右侧的功能

如果您只想保留原始列名并一次在一列中操作,那么使用聚合函数似乎比dplyr更好。避免使用汇总功能

总结功能文档中的注释

使用现有变量名时要小心;相应的 列将立即用新数据更新,这可以 影响引用这些变量的后续操作

比如说

## modified example from aggregate documentation with character variables and NAs
testDF <- data.frame(v1 = c(1,3,5,7,8,3,5,NA,4,5,7,9),
                 v2 = c(11,33,55,77,88,33,55,NA,44,55,77,99) )
by <- c("red", "blue", 1, 2, NA, "big", 1, 2, "red", 1, NA, 12)

aggregate(x = testDF, by = list(by1), FUN = "sum")
Group.1 v1  v2
1       1 15 165
2      12  9  99
3       2 NA  NA
4     big  3  33
5    blue  3  33
6     red  5  55
##修改了包含字符变量和NAs的聚合文档中的示例
testDF使用data.table

setDT(df1)[,  lapply(.SD, sum) , by = ID, .SDcols = "PSM" ]
testDF$ID=by1
ddply(testDF, .(ID), summarize, v1=sum(v1), v2=sum(v2) )
ID v1  v2
1    1 15 165
2   12  9  99
3    2 NA  NA
4  big  3  33
5 blue  3  33
6  red  5  55
7 <NA> 15 165
ddply(testDF, .(ID), summarize, v1=max(v1,v2), v2=min(v1,v2) )
ID v1 v2
1    1 55 55
2   12 99 99
3    2 NA NA
4  big 33 33
5 blue 33 33
6  red 44 11
7 <NA> 88 77

ddply(testDF, .(ID), summarize, v1=min(v1,v2), v2=min(v1,v2) )
ID v1 v2
1    1  5  5
2   12  9  9
3    2 NA NA
4  big  3  3
5 blue  3  3
6  red  1  1
7 <NA>  7  7
setDT(df1)[,  lapply(.SD, sum) , by = ID, .SDcols = "PSM" ]