使用dplyr对列进行条件求和

迈克尔·泰勒(Michael S Taylor)

我有一个数据框,其中有八个月来采样的四个栖息地。每个月从每个栖息地收集十个样品。计算每个样品中物种的个体数量。以下代码生成结构相似的较小数据帧。

# Pseudo data
Habitat <- factor(c(rep("Dry",6), rep("Wet",6)), levels = c("Dry","Wet"))
Month <- factor(rep(c(rep("Jan",2), rep("Feb",2), rep("Mar",2)),2), levels=c("Jan","Feb","Mar"))
Sample <- rep(c(1,2),6)
Species1 <- rpois(12,6)
Species2 <- rpois(12,6)
Species3 <- rpois(12,6)

df <- data.frame(Habitat,Month, Sample, Species1, Species2, Species3)

我想对所有采样物种的月总数进行汇总。我正在使用ddply(首选),但我愿意接受其他建议。

我得到的最接近的结果是将每一列的总和相加,如下所示。

library(plyr)
ddply(df, ~ Month, summarize, tot_by_mon = sum(Species1) + sum(Species2) + sum(Species3))

#   Month tot_by_mon
# 1   Jan         84
# 2   Feb         92
# 3   Mar         67

这行得通,但是我想知道是否存在一种通用方法来处理具有“未知”数量物种的案例。也就是说,第一个物种始终始于第4列,但最后一个物种可能位于第10列或第42列。我不想将实际的物种名称硬编码到摘要函数中。请注意,物种名称相差很大,例如Doryflav和Pheibica。

坦率

与@useR的data.table的答案类似melt,您可以使用tidyr来重塑gather

library(tidyr)
library(dplyr)
gather(df, Species, Value, matches("Species")) %>% 
  group_by(Month) %>% summarise(z = sum(Value))

# A tibble: 3 x 2
   Month     z
  <fctr> <int>
1    Jan    90
2    Feb    81
3    Mar    70

如果您知道按位置而不是要“匹配”的模式的列...

gather(df, Species, Value, -(1:3)) %>% 
  group_by(Month) %>% summarise(z = sum(Value))

(结果使用@akrun的set.seed(123)示例数据显示。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章