R 基于特定因子组合求和行数

R 基于特定因子组合求和行数,r,plyr,data.table,R,Plyr,Data.table,这可能是一个愚蠢的问题,但我已经通读了Crawley关于数据帧的一章,浏览了互联网,但还没能使任何东西起作用 下面是一个与我的类似的示例数据集: > data<-data.frame(site=c("A","A","A","A","B","B"), plant=c("buttercup","buttercup", "buttercup","rose","buttercup","rose"), treatment=c(1,1,2,1,1,1), plant_numb=c(1,1,2,

这可能是一个愚蠢的问题,但我已经通读了Crawley关于数据帧的一章,浏览了互联网,但还没能使任何东西起作用

下面是一个与我的类似的示例数据集:

> data<-data.frame(site=c("A","A","A","A","B","B"), plant=c("buttercup","buttercup",
"buttercup","rose","buttercup","rose"), treatment=c(1,1,2,1,1,1), 
plant_numb=c(1,1,2,1,1,2), fruits=c(1,2,1,4,3,2),seeds=c(45,67,32,43,13,25))
> data
  site     plant treatment plant_numb fruits seeds
1    A buttercup         1          1      1    45
2    A buttercup         1          1      2    67
3    A buttercup         2          2      1    32
4    A      rose         1          1      4    43
5    B buttercup         1          1      3    13
6    B      rose         1          2      2    25  
这个示例非常基本(我的数据集是~5000行),虽然在这里您只看到需要求和的两行,但需要求和的行数不同,范围从1到~45

到目前为止,我已经尝试了rowsum()和tapply(),结果非常糟糕(错误告诉我这些函数对因子没有意义),因此如果你能给我指出正确的方向,我将不胜感激


非常感谢

希望下面的代码是完全自解释的。它使用基本函数“聚合”,基本上就是说,对于每一个独特的场地、植物、处理和植物数量的组合,看水果和种子的总和

# Load your data
data <- data.frame(site=c("A","A","A","A","B","B"), plant=c("buttercup","buttercup",
"buttercup","rose","buttercup","rose"), treatment=c(1,1,2,1,1,1), 
plant_numb=c(1,1,2,1,1,2), fruits=c(1,2,1,4,3,2),seeds=c(45,67,32,43,13,25)) 

# Summarize your data
aggregate(cbind(fruits, seeds) ~ 
      site + plant + treatment + plant_numb, 
      sum, 
      data = data)
#  site     plant treatment plant_numb fruits seeds
#1    A buttercup         1          1      3   112
#2    B buttercup         1          1      3    13
#3    A      rose         1          1      4    43
#4    B      rose         1          2      2    25
#5    A buttercup         2          2      1    32

为了完整起见,这里是@Chase建议的
data.table
解决方案。对于较大的数据集,这可能是最快的方法:

library(data.table)
data.dt <- data.table(data)
setkey(data.dt, site)
data.dt[, lapply(.SD, sum), by = list(site, plant, treatment, plant_numb)]

     site     plant treatment plant_numb fruits seeds
[1,]    A buttercup         1          1      3   112
[2,]    A buttercup         2          2      1    32
[3,]    A      rose         1          1      4    43
[4,]    B buttercup         1          1      3    13
[5,]    B      rose         1          2      2    25
库(data.table)

data.dt只是为了在很长一段时间后更新此答案,
dplyr
/
tidyverse
解决方案将是

library(tidyverse)

data %>% 
  group_by(site, plant, treatment, plant_numb) %>% 
  summarise(fruits=sum(fruits), seeds=sum(seeds))

查看
plyr
data.table
标签。很多问题基本上解决了这个问题。祝你好运还可以看到,在我问了这个问题后,我只是在玩聚合,但你已经大大加快了我的速度。谢谢你的帮助。不过,还有一个问题:当我输入如您所示的代码时,会出现错误“as.data.frame.default(x)中的错误:无法将类“formula”强制转换为data.frame”。有什么办法让它发挥作用吗?不幸的是,两者都有。对于示例和我的实际数据集(没有空格),我得到了相同的错误消息:>aggregate(cbind(水果、种子)~site+plant+treatment+plant\u numb,sum,data=data)在as.data.frame.default(x)中出错:无法将类“formula”强制转换为data.framePLYR解决方案应该仍然有效。但听起来好像你没有一个公式版的聚合。您使用的是哪个版本的R?我认为自2.11以来,aggregate允许公式输入
library(data.table)
data.dt <- data.table(data)
setkey(data.dt, site)
data.dt[, lapply(.SD, sum), by = list(site, plant, treatment, plant_numb)]

     site     plant treatment plant_numb fruits seeds
[1,]    A buttercup         1          1      3   112
[2,]    A buttercup         2          2      1    32
[3,]    A      rose         1          1      4    43
[4,]    B buttercup         1          1      3    13
[5,]    B      rose         1          2      2    25
library(tidyverse)

data %>% 
  group_by(site, plant, treatment, plant_numb) %>% 
  summarise(fruits=sum(fruits), seeds=sum(seeds))