汇总数据框中的一系列列

时间:2014-08-31 00:55:04

标签: r plyr

我无法在数据框中对选择列进行求和,这是一个基本问题,我在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

但是我怎么得到这笔钱呢?我已经搞乱了aggregate命令和ddply,并且已经看到很多调用特定列名的例子,但是还没有任何工作。我知道这是一个常见问题和简单类型问题的变体,但我花了几个小时没有自己解决它。所以,为我的愚蠢道歉!

2 个答案:

答案 0 :(得分:1)

这样可行:

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

答案 1 :(得分:1)

尝试使用基础R:

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