我有一个由420行和37列组成的数据框,来自昆虫场采样数据。我试图每5行对列值进行求和,以便每5行变成1。此外,我试图使我的数据框($site,$date,$plot)中的非数值“折叠”,以便它们适合由我提到的总和组成的单个新行。
我尝试使用这个线程的建议:
对R中数据帧的每n行的列求和
包括使用包dplyr的summarize_each函数以及作为data. table一部分的gl和colSums。
我已经在我的整个数据框上尝试了这些
Library(data. table)setDT(FinalData)[,as.list(colSums(.SD)),by=gl(天花板(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.
这个管用吗?
FinalData %>%
group_by(Site.Date.Plot) %>%
summarise_all(list(sum))
这将保留第一列并对其余列求和。
如果你想保持第一列Site.Date,你可以尝试使用
mutate_at
。绘图
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)
第一个问题是,在您的data. table
和dplyr
解决方案中,sum
函数对Site.Date的因子进行操作。这就是您收到错误的原因。
第二个改进是您的因子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)