对数据帧中的列范围进行求和

问题描述:

我无法在数据框中对选择列进行求和,这是一个基本问题,我在StackOverflow上看到了许多类似但不相同的问题/答案。对数据帧中的列范围进行求和

有了这个也许过于复杂的数据帧:

site<-c(223,257,223,223,257,298,223,298,298,211) 
moisture<-c(7,7,7,7,7,8,7,8,8,5) 
shade<-c(83,18,83,83,18,76,83,76,76,51) 
sampleID<-c(158,163,222,107,106,166,188,186,262,114) 
bluestm<-c(3,4,6,3,0,0,1,1,1,0) 
foxtail<-c(0,2,0,4,0,1,1,0,3,0) 
crabgr<-c(0,0,2,0,33,0,2,1,2,0) 
johnson<-c(0,0,0,7,0,8,1,0,1,0) 
sedge1<-c(2,0,3,0,0,9,1,0,4,0) 
sedge2<-c(0,0,1,0,1,0,0,1,1,1) 
redoak<-c(9,1,0,5,0,4,0,0,5,0) 
blkoak<-c(0,22,0,23,0,23,22,17,0,0) 

my.data<-data.frame(site,moisture,shade,sampleID,bluestm,foxtail,crabgr,johnson,sedge1,sedge2,redoak,blkoak) 

我要总结每个植物物种(须芒草,狗尾草等 - 在这个例子中列4-12)的计数每个站点内时,由合计具有相同站点编号的行。我还想保留有关湿度和阴影的信息(这些与站点一致,但也可能是站点之间的相同),并且需要一个新的列,即总计行数。

的结果是这样的

网站,防潮,遮光,NUMSAMPLES,bluestm,谷子,crabgr,约翰逊,sedge1,sedge2,REDOAK,blkoak
211,5,51,1,0,0 ,0,0,0,1,0,0
223,7,83,4,13,5,4,8,6,1,14,45
257,7,18,2,4,2 ,33,0,0,1,1,22
298,8,76,3,2,4,3,9,13,2,9,40

我遇到的问题是,我的真正的数据集(我有几个)有50到300种植物,我想参考一系列的列(即,在这种情况下,[5:12])而不是my.data $ foxtail,my.data $ sedge1等,这对于300种物种来说将会非常困难。

我知道我可以通过删除列,我不需要(SampleID)

my.data$SampleID <- NULL 

但后来我如何得到的金额开始?我用汇总命令和ddply搞砸了,并且看到了很多调用特定列名称的例子,但没有得到任何工作。我认识到这是一个常见问题和简单类型问题的变体,但我花了几个小时而没有自行解决。所以,为我的愚蠢道歉!

+0

@ SteveT:您的反馈将不胜感激。 – rnso 2014-08-31 08:47:09

该工程确定:使用基础R以下

x <- aggregate(my.data[,5:12], by=list(site=my.data$site, moisture=my.data$moisture, shade=my.data$shade), FUN=sum, na.rm=T) 



library(dplyr) 

my.data %>% 
    group_by(site) %>% 
    tally %>% 
    left_join(x) 

    site n moisture shade bluestm foxtail crabgr johnson sedge1 sedge2 redoak blkoak 
1 211 1  5 51  0  0  0  0  0  1  0  0 
2 223 4  7 83  13  5  4  8  6  1  14  45 
3 257 2  7 18  4  2  33  0  0  1  1  22 
4 298 3  8 76  2  4  3  9  13  2  9  40 

还是做这一切在dplyr

my.data %>% 
    group_by(site) %>% 
    tally %>% 
    left_join(my.data) %>% 
    group_by(site,moisture,shade,n) %>% 
    summarise_each(funs(sum=sum)) %>% 
    select(-sampleID) 


    site moisture shade n bluestm foxtail crabgr johnson sedge1 sedge2 redoak blkoak 
    1 211  5 51 1  0  0  0  0  0  1  0  0 
    2 223  7 83 4  13  5  4  8  6  1  14  45 
    3 257  7 18 2  4  2  33  0  0  1  1  22 
    4 298  8 76 3  2  4  3  9  13  2  9  40 
+0

感谢你的上面的例子似乎这样做,我想我能理解它。较低(全部在dplyr中)计算不正确。感谢您的工作解决方案! – 2014-08-31 13:41:51

+0

@SteveT - 良好的捕捉,修复。 – jalapic 2014-08-31 14:14:09

+0

谢谢,修复它。但是,当我开始实际执行此操作时,我收到了此错误,呃:install.packages中的警告: 软件包'dplyr'不可用(对于R 2.15.2版) – 2014-08-31 15:00:44

尝试:

outdf<-data.frame(site=numeric(),moisture=numeric(),shade=numeric(),bluestm=numeric(),foxtail=numeric(),crabgr=numeric(),johnson=numeric(),sedge1=numeric(),sedge2=numeric(),redoak=numeric(),blkoak=numeric()) 

my.data$basic = with(my.data, paste(site, moisture, shade)) 

for(b in unique(my.data$basic)) { 
     outdf[nrow(outdf)+1,1:3] = unlist(strsplit(b,' ')) 
     for(i in 4:11) 
      outdf[nrow(outdf),i]= sum(my.data[my.data$basic==b,i]) 
} 

outdf 
    site moisture shade bluestm foxtail crabgr johnson sedge1 sedge2 redoak blkoak 
1 223  7 83  13  5  4  8  6  1  14  45 
2 257  7 18  4  2  33  0  0  1  1  22 
3 298  8 76  2  4  3  9  13  2  9  40 
4 211  5 51  0  0  0  0  0  1  0  0 
+0

谢谢,看起来像是有效的。 – 2014-08-31 13:42:17