以行为条件,修改所有列而不循环

nim*_*iug 2 r rows conditional-statements data.table

我想要做的是根据行条件修改 R 数据表的所有选定列,即在此输入图像描述

对于 cols 变量中选择的所有 4 列,如果值大于(或等于)1.5,我想将它们设置为 1,否则为 0

我尝试过类似的事情:iris[(cols) > 1.5 , (cols) := 1, .SDcols = cols]

谢谢

r2e*_*ans 6

一种data.table方法:

iris <- as.data.table(iris)
cols <- names(iris)[1:4]
cols
# [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 
iris[, (cols) := lapply(.SD, function(z) fifelse(z > 1.5, 1, z)), .SDcols = cols]
iris
#      Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
#             <num>       <num>        <num>       <num>    <fctr>
#   1:            1           1          1.4         0.2    setosa
#   2:            1           1          1.4         0.2    setosa
#   3:            1           1          1.3         0.2    setosa
#   4:            1           1          1.5         0.2    setosa
#   5:            1           1          1.4         0.2    setosa
#   6:            1           1          1.0         0.4    setosa
#   7:            1           1          1.4         0.3    setosa
#   8:            1           1          1.5         0.2    setosa
#   9:            1           1          1.4         0.2    setosa
#  10:            1           1          1.5         0.1    setosa
#  ---                                                            
# 141:            1           1          1.0         1.0 virginica
# 142:            1           1          1.0         1.0 virginica
# 143:            1           1          1.0         1.0 virginica
# 144:            1           1          1.0         1.0 virginica
# 145:            1           1          1.0         1.0 virginica
# 146:            1           1          1.0         1.0 virginica
# 147:            1           1          1.0         1.0 virginica
# 148:            1           1          1.0         1.0 virginica
# 149:            1           1          1.0         1.0 virginica
# 150:            1           1          1.0         1.0 virginica
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用set

for (nm in cols) set(iris, which(iris[[nm]] > 1.5), nm, 1)
Run Code Online (Sandbox Code Playgroud)