提问者:小点点

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


我有一个由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.

共3个答案

匿名用户

这个管用吗?

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. tabledplyr解决方案中,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)