Dan*_*n Y 5 for-loop r data.table
我有R代码,但它不够优雅且效率低下.我想知道是否有更好的方法:即如何对这个过程进行矢量化和/或减少计算时间?
library(data.table)
dt <- data.table(
visited_a = c(1, 1, 0, 0),
visited_b = c(1, 0, 0, 0),
visited_c = c(0, 0, 1, 1),
purchased = c("b", "b", "c", "a")
)
Run Code Online (Sandbox Code Playgroud)
我的data.table有关于消费者是否在2017年访问商店的虚拟指标.因此visited_a = 0意味着她a在2017年visited_b = 1没有访问商店b,这意味着她在2017年访问了商店.数据还列出了消费者在2018年购买的商店; 所有这些消费者都进行了购买.因此,消费者可能已经或可能没有访问过她(今年)购买的商店(去年).
我想添加一个变量purchased_was_visited来捕获它.解决方案是:
dt$purchased_was_visited <- c(1, 0, 1, 0)
Run Code Online (Sandbox Code Playgroud)
这是我非常不雅的代码,可悲地循环遍历data.table一次一行.肯定有更好的办法!
dt[ , purchased_was_visited := NA]
for(i in 1:nrow(dt)) {
brand <- dt[i, purchased]
col <- paste0("visited_", brand)
was_it <- dt[i, ..col]
dt[i, purchased_was_visited := was_it]
}
Run Code Online (Sandbox Code Playgroud)
一个选项是通过对每行进行分组来使用get。必须准备purchased需要评估的列名称(基于 )以检查过去的访问情况。现在,get如果对每一行进行评估,函数将提供所需的结果。因此,我们需要对每一行进行分组(例如by=1:NROW(dt)):
library(data.table)
dt[,purchased_was_visited := get(paste("visited",purchased,sep="_")), by=1:NROW(dt)]
dt
# visited_a visited_b visited_c purchased purchased_was_visited
# 1: 1 1 0 b 1
# 2: 1 0 0 b 0
# 3: 0 0 1 c 1
# 4: 0 0 1 a 0
Run Code Online (Sandbox Code Playgroud)