当前位置: 首页 > 知识库问答 >
问题:

data.table中的行条件列操作

融烨华
2023-03-14

我有一个很大的数据表,其中每一行都需要基于完整数据表的一部分进行计算。作为一个例子,考虑下面的数据表,并假设每一行的I都需要计算当前行的id2与id1匹配的每一行的num变量之和,以及当前行的时间变量在距离当前行的时间1的范围内。

set.seed(123)

dat <- data.table(cbind(id1=sample(1:5,10,replace=T),
                        id2=sample(1:5,10,replace=T),
                        num=sample(1:10,10,replace=T),
                        time=sample(1:10,10,replace=T)))

这可以通过像这样循环每一行来轻松完成

dat[,val:= 0]
for (i in 1:nrow(dat)){
  this.val <- dat[ (id2==id1[i]) & (time>=time[i]-2) & (time<=time[i]+2),sum(num)]
  dat[i,val:=this.val]
}

dat

生成的 data.table 如下所示:

   > dat
        id1 id2 num time val
     1:   2   5   9   10   6
     2:   4   3   7   10   0
     3:   3   4   7    7  10
     4:   5   3  10    8   9
     5:   5   1   7    1   2
     6:   1   5   8    5   6
     7:   3   2   6    8  17
     8:   5   1   6    3  10
     9:   3   2   3    4   0
    10:   3   5   2    3   0

什么是正确的/快速的方法来做这样的事情使用data.table?

共有1个答案

阎宝
2023-03-14

我们可以在这里使用自连接,方法是创建“timeminus2”和“timeplus2”列,通过“id2”与“id1”和非等逻辑条件连接,以获得“num”的总和并将(:=)“val”列分配给原始数据集

tmp <- dat[.(id1 = id1, timeminus2 = time - 2, timeplus2 = time + 2), 
             .(val = sum(num)),
             on = .(id2 = id1, time >= timeminus2, time <= timeplus2),
             by = .EACHI
         ][is.na(val), val := 0][]
dat[, val := tmp$val][]
#     id1 id2 num time val
# 1:   2   5   9   10   6
# 2:   4   3   7   10   0
# 3:   3   4   7    7  10
# 4:   5   3  10    8   9
# 5:   5   1   7    1   2
# 6:   1   5   8    5   6
# 7:   3   2   6    8  17
# 8:   5   1   6    3  10
# 9:   3   2   3    4   0
#10:   3   5   2    3   0
 类似资料:
  • 与数据帧相比,我对使用< code>data.table的< code>tapply类操作的速度提升印象极为深刻。 例如: 然而,我并没有完全设法让它比类操作中的数据帧工作得更快(即,需要将函数应用于每一行的情况)。 这真的只是意料之中还是有一些技巧?

  • 我知道这应该很简单,但是我想从熊猫数据框中取一列,并且只对满足某些条件(比如小于1)的条目乘以标量(比如2)。 例如,在这个数据框中, 如果我有兴趣在列上执行此操作,结果应该是 我有以下绝对任务: 但是我不知道如何使用中的实际值。 提前谢谢!

  • 对于虚拟数据集 现在数据集看起来像这样: 3列。对于每个团队,他们在不同的列中有团队成员和团队领导。团队可能只有成员而没有领导者,反之亦然。 以下是我几乎想要的输出: 我希望将两列合并成一列,如果其中一列是团队领导,则添加一个标记。 我有一个丑陋的解决方案, <代码>dt1 问题: > 我认为,这种解决方案不是有效的,先合并,然后融化。那么,还有其他方法吗? 在第3行和第4行有重复的行。 当我试图

  • 本文向大家介绍如何通过R中data.table中的列名删除列?,包括了如何通过R中data.table中的列名删除列?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过将列设置为NULL来实现 示例 删除一列x 删除两列

  • 问题内容: 我有两个这样的表,两个都是单独的表 另一个表包含以下结构 我需要从表II中选择AccountNo或TempAccountNo,Mycolumn,条件是 我需要选择 我需要选择 我该如何实现。 问题答案:

  • 我学校的一位橄榄球教练让我为即将到来的比赛编写一份有条件的橄榄球抽签,任务如下:给出一份从1-12分为3组的球队名单([Group1=1,2,3,4],[Group2=5,6,7,8],[Group3=9,10,11,12])生成并打印具有以下条件的11轮比赛: > 第1组中的团队不与第3组中的团队对抗 第1组中的团队与第1组中的其他团队对比两次(例如1v2、2v1、1v3、3v1、1v4、4v1