r语言 - For循环和变量生成



我希望使用循环更有效地运行以下行:

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)
}

比较整个数据。表>0cbind。这里不需要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: ...

最新更新