gpt4 book ai didi

r - 加速此循环以使用 data.table 创建虚拟列并在 R 中设置

转载 作者:行者123 更新时间:2023-12-04 22:43:21 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Creating dummy variables in R data.table

(1 个回答)


5年前关闭。




我有一个数据表,我想为每个唯一的日期创建一个新列,然后在该日期与列名称匹配的每一行中分配一个 1

我已经使用 for 循环完成了此操作,但我想知道是否有任何方法可以使用 data.table 和 set 对其进行优化?

这是一个例子

dt <- data.table(Week_Day = c("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"))

Day <- unique(dt$Week_Day)
for (i in 1:length(Day)) {
if (Day[i] != "Sunday") {
dt[, Day[i] := ifelse(Week_Day == Day[i], 1, 0)]
}
}

我的表有 298k 行,虽然执行时间不长(如下),但它是一个长脚本的一部分,我有很多低效循环,所以我试图缩短整体运行时间。

运行时间:
user  system elapsed
0.99 0.06 1.05

提前致谢。

最佳答案

这是一种不同的方法,它在我的机器上比问题中的原始方法表现更好

1) 获得除星期日以外的独特日子

Day <- setdiff(dt$Week_Day, "Sunday")

2) 用 0 初始化新列:
dt[, (Day) := 0L]

3)在循环中通过引用更新1s:
for(x in Day) {
set(dt, i = which(dt[["Week_Day"]] == x), j = x, value = 1L)
}

简单的性能对比:
dt1 <- data.table(Week_Day = sample(c("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"), 3e5, TRUE))

dt2 <- copy(dt1)


system.time({
Day <- setdiff(unique(dt$Week_Day), "Sunday")
dt1[, (Day) := 0L]
for(x in Day) {
set(dt1, i = which(dt1[["Week_Day"]] == x), j = x, value = 1L)
}
})
# User System verstrichen
# 0.029 0.003 0.032

system.time({
Day <- unique(dt$Week_Day)
for (i in 1:length(Day)) {
if (Day[i] != "Sunday") {
dt2[, Day[i] := ifelse(Week_Day == Day[i], 1L, 0L)]
}
}
})

# User System verstrichen
# 0.138 0.070 0.210


all.equal(dt1, dt2)
#[1] TRUE

关于r - 加速此循环以使用 data.table 创建虚拟列并在 R 中设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38526086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com