【问题标题】:R: Subtract a row from others in groupR:从组中的其他人中减去一行
【发布时间】:2017-09-14 16:16:17
【问题描述】:

我有一个如下所示的 data.frame(或 data.table)

Col1  Col2  Col3
1      A     23
1      B     26
2      A     20
2      C     10

我在Col1 上分组了这些数据。我想从每一行获取一定范围内的行数(比如 5;在 Col3 上计算的差异)。

所以我应该得到这样的结果

Col1  Col2  Col3 Col4
1      A     23  1  
1      B     26  1
2      A     20  0
2      C     10  0

在这种情况下,基数是每行的 Col3。因此,例如 - row1, Col3 在组中有一行,距离 row1, Col3 5 以内。同样,在第二组中,没有任何行在 5 距离内。

如何在 data.table 中做到这一点?

【问题讨论】:

  • 在基于什么的范围内?我们比较的是什么值,基值是什么?
  • 第 2 行和第 3 行不在 5 的范围内,所以我希望第 3 行和第 4 行的值为零而不是 1?
  • @BigDataScientist OP 说按 Col1 分组所以我认为没关系,但我不明白为什么在第 1 行 Col4 是 2 但在第 2 行 Col4 是 1,如果我正确理解 OP 他们应该两者是 2
  • 我的错。发帖时我没有意识到这个错误。我刚刚更正了。
  • 您能否删除反对票。我已经编辑了问题。

标签: r data.table


【解决方案1】:
ave(abs(ave(df$Col3,
            df$Col1,
            FUN = function(x) c(Inf, (x[1] - x)[-1]))) <= 5,
    df$Col1,
    FUN = sum)
#[1] 1 1 0 0

内部ave 计算同一组内元素之间的差异。外层ave计算绝对差小于5的行数。

更新

#DATA
df <- data.frame(Col1 = c(1,1,2,2,2), Col3 = c(24,25,21,20,10))

temp = ave(abs(ave(df$Col3,
            df$Col1,
            FUN = function(x) c(Inf, (x[1] - x)[-1]))) <= 5,
    df$Col1,
    FUN = sum)
replace(temp, abs(ave(df$Col3, df$Col1, FUN = function(x) c(0, (x[1] - x)[-1]))) > 5, 0)
#[1] 1 1 1 1 0

【讨论】:

  • 它不起作用。因为 diff 只计算连续的差异。
  • 看起来不错,我喜欢(x[1] - x)[-1] 方法来查找每个值的差异。
  • df &lt;- data.table(Col1 = c(1,1,2,2,1,3,3), Col3 = c(24,25,26,28,16,18,20));df &lt;- group_by(df, Col1); df$Col4 &lt;- ave(abs(ave(df$Col3,df$Col1,FUN = function(x) c(Inf, (x[1] - x)[-1]))) &lt;= 5,df$Col1,FUN = sum)。这导致全 1。但是对于df$Col1 = 16,它应该导致 0
  • 我不明白为什么人们对我的问题投了反对票。您给出的解决方案仅适用于给定的示例。如果我再添加一行 'df
  • 谢谢@d.b。以这个例子df &lt;- data.table(Col1 = c(1,1,2,2,2), Col3 = c(24,25,21,20,10))'. The output for this should be data.table(Col1 = c(1,1,2,2,2), Col3 = c(24,25,21,20,10), Col4 = c(1,1,1, 1,0))`
【解决方案2】:

我刚刚想通了。使用 data.table 和 sapply。

df <- data.table(Col1 = c(1,1,2,2,2), Col3 = c(24,25,21,20,10))
df[,Col4 := sapply(Col3, function (y) (sum(abs(y - Col3)<=5)-1)), by = .(Col1)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 2023-03-12
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多