我希望使用循环更有效地运行以下行:
library(data.table)
set.seed(3199)
var1 <- rnorm(100, 0, 0.1)
var2 <- rnorm(100, -45, 12)
var3 <- rnorm(100, 4, 56)
vars <- data.table(cbind(var1, var2, var3))
vars <- vars[, var1_dummy := ifelse(var1 > 0, 1, 0)]
vars <- vars[, var2_dummy := ifelse(var2 > 0, 1, 0)]
vars <- vars[, var3_dummy := ifelse(var3 > 0, 1, 0)]
我已经尝试运行这个循环:
set.seed(3199)
var1 <- rnorm(100, 0, 0.1)
var2 <- rnorm(100, -45, 12)
var3 <- rnorm(100, 4, 56)
vars <- data.table(cbind(var1, var2, var3))
for (i in c(var1, var2, var3)){
vars <- vars[, i_dummy := ifelse(i > 0, 1, 0)]
}
然而,它不是我想要的。你知道如何解决这个问题吗?对我来说,在结构oldvariable_dummy中命名新变量是很重要的。
非常感谢。丹尼尔
您也可以使用lapply()
library(data.table)
set.seed(3199)
var1 <- rnorm(100, 0, 0.1)
var2 <- rnorm(100, -45, 12)
var3 <- rnorm(100, 4, 56)
vars <- data.table(cbind(var1, var2, var3))
# Index the number of columns
i<- 1:ncol(vars)
vars[ ,paste0("var", i,"_dummy") := lapply(as.list(vars), function(x) ifelse(x > 0, 1, 0)) ]
这是你想要的吗?
set.seed(3199)
var1 <- rnorm(100, 0, 0.1)
var2 <- rnorm(100, -45, 12)
var3 <- rnorm(100, 4, 56)
vars <- data.table(cbind(var1, var2, var3))
for (i in seq(ncol(vars))){
vars[, paste0(names(vars)[i],"_dummy")] = ifelse(vars[, ..i] > 0, 1, 0)
}
比较整个数据。表>0
和cbind
。这里不需要for/lapply
循环。
cbind(vars, `colnames<-`(+(vars > 0), paste0(names(vars), '_dummy')))
# var1 var2 var3 var1_dummy var2_dummy var3_dummy
# 1: 0.0654072619 -42.44002 8.91351105 1 0 1
# 2: -0.2076242930 -42.95485 12.61592218 0 0 1
# 3: -0.0645006898 -46.89308 -29.81436497 0 0 0
# 4: ...