我有一个由昆虫田间采样数据中的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.
答案 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.table
和dplyr
解决方案中,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)