【问题标题】:R: aggregate over rows if X is less than value, don't aggregate if notR:如果 X 小于值,则聚合行,否则不聚合
【发布时间】:2016-03-01 21:30:09
【问题描述】:

我正在尝试根据特定列聚合 R 中的一些数据。 示例数据如下。

> d <- data.frame(POS=c(1,2,2,2,3,4,4,5), Dist=c(111,6,9,58,250,4,65,111),Read=c(1,2,6,6,25,1,8,11))
> print(d)
  POS Dist Read
1   1  111    1
2   2    6    2
3   2    9    6
4   2   58    6
5   3  250   25
6   4    4    1
7   4   65    8
8   5  111   11

我想要做的是根据列计算跨行的平均值仅当距离列小于 100 时才读取。因此,在 POS 列下,我希望将第 1 行单独保留为第 1 组,然后计算第 2、3 和 4 行的平均值,第 5 行单独作为第 3 组,然后计算第 4 组的第 6 和 7 行的平均值(平均值 = 4.5)。

“真实”数据集没有 POS 列,并且长度 >24,000 行,所以我宁愿不确定哪些行应该手动平均。

【问题讨论】:

  • 你可以试试library(data.table) ; setDT(df)[, M := mean(W23540_02[Distance..2.1. &lt; 100]), by = POS][is.na(M), M := as.double(W23540_02)],虽然我不知道你是怎么想出那个55.7的。

标签: r aggregate


【解决方案1】:

好的,应该可以了。

df 表示数据框,或存储数据的对象。

library(dplyr)

summary_dataset <- d %>% filter(Dist < 100) %>% group_by(POS) %>% summarize(Mean = mean(Read))

要将这些汇总值绑定到数据集上,只需使用它即可。

d$Mean <- summary_dataset$Mean[match(d$POS, summary_dataset$POS)]

另外,我确信有一种比我做的更简单的方法。应该有一个简单的一行代码可以做到这一点,但我不知道。

【讨论】:

  • 感谢您查看此内容!我添加了一个数据集并试图更好地解释我遇到的问题。
  • 好的,所以我根据您的要求调整了代码。它可以完成这项工作吗?
  • 很高兴听到,很高兴为您提供帮助!
  • OP 更新了他们的帖子,我现在看不到“M 栏”。请记住,元评论对未来的读者不是很有用 - 如果您对问题的质量有反馈,请将其添加为问题下方的评论。我将对此进行编辑,但请随时进一步编辑。
猜你喜欢
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2021-11-07
相关资源
最近更新 更多