【问题标题】:Sum rows at specific column intervals以特定列间隔对行求和
【发布时间】:2020-06-16 14:50:17
【问题描述】:

我有一个 1129 行和 4662 列的大型数据框。我想以每 3 列的间隔对数据框中的行值求和,然后如果每 3 列的行总和 >0,则为这些总和中的每一个返回 1,如果总和

df <- read.table(text ="     2005-09-23_2005-09-26  2005-09-27_2005-10-30  2005-10-07_2005-10-08  2005-10-09_2005-10-10  2005-10-11_2005-10-12  2005-10-13_2005-10-14
1  1       0     1     1     1     1           
2  1       1     0     0     0     0     
3  NA      NA    NA     NA     NA     0", header = TRUE)

我想要的结果是这样的:

result <- read.table(text ="     2005-09-23_2005-10-08  2005-10-09_2005-10-14
1  1       1           
2  1       0     
3  NA      0", header = TRUE)

我寻找了类似的问题,似乎 rollapply (R: summing over an interval of rows) OR rowsum 可以工作 (R: summing over an interval of rows),但我找不到使用列作为间隔而不是行来对行求和的方法,也不知道如何以重复的顺序进行。有人会这么好心帮我写一些代码吗?非常感谢!

【问题讨论】:

  • 我需要更清楚一点 - (a) “以每 7 列为间隔对行值求和” 你的意思是对第 1 到第 7 列、第 8 到第 14 列求和吗, ETC?或者你的意思是总和列 1 + 8 + 15 + ...,列 2 + 9 + 16 + ...? (b) "如果每 3 列的行总和 >0,则为每个总和返回 1,如果总和 "3 来自哪里?这是一个错字,应该是7?如果总和是0.5,它既>0又
  • 嗨 Gregor,很抱歉不清楚,我已经编辑了我的问题。所以我想对第 1 到第 3 列的行值求和,然后对第 4 到第 6 列的行值求和,然后从第 7 列到第 9 列的行值求和,等等。我几乎需要每 3 列聚集或聚合我的数据,在我的真实数据中代表天……也就是说,如上所述,以三天为间隔汇总数据。我希望这有助于澄清。

标签: r rowsum


【解决方案1】:

仅当列数可被区间整除时才有效。

+(sapply(split.default(df,unlist(lapply(1:(ncol(df)/3),rep,3))),rowSums) > 0)
   1  2
1  1  1
2  1  0
3 NA NA

也许其他人可以找到比
unlist(lapply(1:(ncol(df)/3),rep,3))

更优雅的方法来创建拆分

【讨论】:

  • 而不是splitting,您可以将applythese answers 中的大多数一起使用...不确定最终会不会更优雅。像apply(df, 1, function(x) colSums(matrix(x, nrow = 3))) &gt; 0 这样的东西,但是你需要操纵输出以得到正确的格式......
猜你喜欢
  • 2017-12-13
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
相关资源
最近更新 更多