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

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(足球比赛) 数据表2(足球队收到的卡片): 现在,如果我想基于另一列添加一列,我将在datatable中使用以下函数: 但现在有两个变量需要匹配。球队代码和赛季。这是如何工作的?