【发布时间】:2021-06-25 23:13:06
【问题描述】:
我有一个大约 300 万行的数据集。我创建了一个如下所示的小示例:
ex <- data.table(eoc = c(1,1,1,1,1,2,2,2,3,3), proc1 = c(63035,63020,92344,63035,27567,63020,1234,55678,61112,1236), trigger_cpt = c(63020,63020,63020,63020,63020,63020,63020,63020,61112,61112))
我有另一个 42 行的数据集,但生成了一个较小的示例:
add_on <- data.table(primary = c(63020,61112), secondary=c(63035,63445))
我需要重新标记“trigger_cpt”列上的某些行(按 eoc 分组)如果 trigger_cpt 值恰好是数据集主列中的值之一并且 如果 proc1 值是 add_on 数据集中的次要值。如果符合条件,则trigger_cpt应重新标记为二级代码。
我最初是手动输入所有内容,
ex[,trigger_new := if(any(trigger_cpt == '63020' & proc1 == '63035')) 63035 else trigger_cpt, eoc]
然后决定做一个for循环
for(i in 1:nrow(add_on)){
ex[,trigger_new2 := if(any(trigger_cpt == add_on[i,1] & proc1 == add_on[i,2])) add_on[i,2] else trigger_cpt, eoc]
}
但是,现在我正在我的 300 万行数据集上尝试此代码,运行它需要很长时间。我不确定是否有更好的方法,或者是否可以对我当前的代码进行任何修改?
任何帮助将不胜感激!
预期输出:
ex_final <- data.table(eoc = c(1,1,1,1,1,2,2,2,3,3), proc1 = c(63035,63020,92344,63035,27567,63020,1234,55678,61112,1236), trigger_cpt = c(63035,63035,63035,63035,63035,63020,63020,63020,61112,61112))
【问题讨论】:
-
如果
add_on中的 'eoc' 有不同的值。那么您可能需要使用这些值在“add_on”中创建一个“eoc”列,然后通过“eoc”与其他列进行连接
标签: r for-loop data.table tidyverse