Sky*_*ker 1 grouping aggregate r
我有以下片段,有点不言自明:
> value <- by(df$Percent, df$Year, sum)
> str(value)
'by' int [1:20(1d)] 100 100 100 100 100 100 100 100 100 100 ...
- attr(*, "dimnames")=List of 1
..$ df$Year: chr [1:20] "1993" "1994" "1995" "1996" ...
- attr(*, "call")= language by.default(data = df$Percent, INDICES = df$Year, FUN = sum)
Run Code Online (Sandbox Code Playgroud)
问题是如何提取所有密钥(在本例中为Year)和聚合值(所有和Percents)作为集合?我已经尝试了很多东西,但无法弄清楚如何获得它,例如在这种情况下所有年份和所有百分之.
我找到的唯一方法是使用[[]]运算符迭代和访问它,例如值[[1]],但这是非常低效和不方便的.
更新:我的用例是我有以下数据集,例如
Year Percent
1999 40
1999 20
1999 10
2000 10
2000 20
Run Code Online (Sandbox Code Playgroud)
我只需要每年的百分比之和即
Year Percent
1999 70
2000 30
Run Code Online (Sandbox Code Playgroud)
通过给我这个,但在一个EXTREMELLY不方便的输出结构.我只需要两个列表或一个简单的输出数据帧.
我会建议这样aggregate的事情(如果你坚持使用基础R):
aggregate(Percent ~ Year, mydf, sum)
# Year Percent
# 1 1999 70
# 2 2000 30
Run Code Online (Sandbox Code Playgroud)
tapply 也是一个合理的选择:
with(mydf, tapply(Percent, Year, sum))
# 1999 2000
# 70 30
Run Code Online (Sandbox Code Playgroud)
这与by你将其包装在一起时的结果相同c():
c(with(mydf, by(Percent, Year, sum)))
# 1999 2000
# 70 30
Run Code Online (Sandbox Code Playgroud)
在两个by和的情况下tapply,在这里,你得到一个命名向量,而在aggregate,你得到一个data.frame.
其他方便的选项包括"data.table"和"plyr"/"dplyr".
library(data.table)
setDT(mydf)[, list(Percent = sum(Percent)), by = Year]
library(dplyr)
mydf %>% group_by(Year) %>% summarise(Percent = sum(Percent))
Run Code Online (Sandbox Code Playgroud)
"plyr"选项可以在这里的另一个答案中找到.
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |