提问人:Jota 提问时间:8/12/2011 最后编辑:Jota 更新时间:6/11/2018 访问量:35760
如何使用 R 在数据帧的多列上运行 tapply()?
How to run tapply() on multiple columns of data frame using R?
问:
我有一个如下所示的数据框:
a b1 b2 b3 b4 b5 b6 b7 b8 b9
D 4 6 9 5 3 9 7 9 8
F 7 3 8 1 3 1 4 4 3
R 2 5 5 1 4 2 3 1 6
D 9 2 1 4 3 3 8 2 5
D 5 4 3 1 6 4 1 8 3
R 3 7 9 1 8 5 3 4 2
D 4 1 8 2 6 3 2 7 5
F 7 1 7 2 7 1 6 2 4
D 6 3 9 3 9 9 7 1 2
该函数可以很好地生成一个表,该表将 df[,2] 中的所有内容与 df$a 相加,但是当我尝试获取类似的表时,除了每列的总和(2、3、4,..., 10)之外,我收到一条错误消息:tapply(df[,2], INDEX = df$a, sum)
tapply(df[,2:10], INDEX = df$a, sum)
tapply(df[, 2:10], INDEX = df$a, sum) 中的错误:参数必须具有相同的长度
此外,我希望表的行名是 的列名,这样第 1 行是 b1,第 2 行是 b2,第 9 行是 b9。df[,2:10]
答:
22赞
Joris Meys
8/12/2011
#1
这是因为 tapply 适用于向量,并将 df[,2:10] 转换为向量。接下来,sum 将为您提供总和,而不是每列的总和。使用 ,例如:aggregate()
aggregate(df[,2:10],by=list(df$a), sum)
如果你想返回一个列表,你可以使用 by() 来做到这一点。确保指定 colSums 而不是 sum,因为 by 适用于拆分的数据帧:
by(df[,2:10],df$a,FUN=colSums)
9赞
Doon_Bogan
5/13/2014
#2
另一种可能性是将 和 组合在一起。apply
tapply
apply(df[,-1], 2, function(x) tapply(x, df$a, sum))
将产生输出(这是一个矩阵)
b1 ... b9
D sD1 ... sD9
F sF1 ... sF9
R sR1 ... sR9
然后,您可以使用 用于获取数据框作为输出。as.data.frame()
6赞
Jota
6/1/2015
#3
这是应用于此问题的方法。data.table
library(data.table)
DT <- data.table(df)
DT[, lapply(.SD, sum), by=a]
这是一种方法dplyr
library(dplyr)
df %>% group_by(a) %>% summarise_all(funs(sum))
评论
0赞
Mox
5/24/2018
summarise_each()
已弃用。改用 ,或者改用。要映射所有变量,请使用summarise_all()
summarise_at()
summarise_if()
funs
summarise_all()
0赞
Mox
5/24/2018
还有什么.SD里面的lapply做吗?
0赞
Mox
5/24/2018
".SD 代表类似“Data.table 的子集”。最初的“.”没有任何意义,只是它使与用户定义的列名发生冲突的可能性更大。
评论