如何在第n行中对列数据求和,包括Rstudio中的非数值数据

时间:2019-05-08 00:05:08

标签: r data-manipulation

我有一个由昆虫田间采样数据中的420行和37列组成的数据框。我试图对每5行的列值求和,以使每5行变成1。此外,我试图使我的dataframe($ site,$ date,$ plot)中的非数值“折叠”,以便它们适合由我提到的总和构成的新一行。

我尝试使用此线程的建议:

Summing columns on every nth row of a data frame in R

包括使用dplyr软件包的summary_each函数以及data.table的gl和colSums。

我已经在整个数据框中尝试了这些

库(data.table)  setDT(FinalData)[,as.list(colSums(.SD)),通过= gl(ceiling(420/5),5,420)]

这给了我

colSums(.SD)中的错误:“ x”必须为数字

and 

library(dplyr)
 FinalData %>%
   group_by(indx = gl(ceiling(420/5), 5, 420)) %>%
   summarise_each(funs(sum))

which gives me error: 
Error in Summary.factor(c(4L, 4L, 4L, 4L, 4L), na.rm = FALSE) : 
  ‘sum’ not meaningful for factors

  Site.Date.Plot  CarA  CarB    CarC...
1.SL.VI.1          0     0        1
2.SL.VI.1          0     0        0
3.SL.VI.1          0     6        0
4.SL.VI.1          0     0        3
5.SL.VI.1          1     0        0
...
every 5 rows has a different $Site.Date.Plot. I expect this:

  Site.Date.Plot  CarA  CarB    CarC...
1. SL.VI.1          1     6       4
2. SL.VI.2         ...   ...      ...

But I get the above error messages from above.

3 个答案:

答案 0 :(得分:1)

这有效吗?

FinalData %>%
   group_by(Site.Date.Plot) %>% 
   summarise_all(list(sum))

这将保留第一列,并对其余列求和。

答案 1 :(得分:0)

如果您想保留第一列mutate_at

,可以尝试使用Site.Date.Plot

library(dplyr)

FinalData %>%
  group_by(indx = gl(ceiling(420/5), 5, 420)) %>%
  mutate_at(2:37, sum, na.rm = TRUE) %>%
  slice(1)

或者它也可以与summarise_at一起使用,但是在这种情况下,您将删除第一列

FinalData %>%
  group_by(indx = gl(ceiling(420/5), 5, 420)) %>%
  summarise_at(-1, sum, na.rm = TRUE)

答案 2 :(得分:0)

第一个问题是在您的data.tabledplyr解决方案中,sum函数的运行因子为Site.Date.Plot。这就是为什么您收到错误。

第二个改进是您的因素Site.Date.Plot每5行更改一次。换句话说,我们可以简单地按此分组,而不用创建其他索引。

这些解决方案未经测试,因为样本数据不足。

library(tidyverse)

 FinalData %>%
   group_by(Site.Date.Plot) %>%
   summarise_all(sum)

library(data.table)

setDT(FinalData)
FinalData[, lapply(.SD, sum), by = 'Site.Date.Plot']

#base R
aggregate(x = FinalData[, -1], by = list(FinalData$Site.Date.Plot), FUN = sum)