【问题标题】:How to use nested loops in R to change values?如何在 R 中使用嵌套循环来更改值?
【发布时间】:2021-07-06 21:39:56
【问题描述】:

我有一个数据集,我希望所有 1 都为 0,任何超过 1 的都为 1。 我试过用括号代替方括号。

for (i in 1:nrow(StudentDrugs)){
  for(j in 1:ncol(StudentDrugs)){
    ifelse([i,j] == 1, 0, 1)
  }
}

我得到: Error: unexpected '[' in: " for(j in 1:ncol(StudentDrugs)){ ifelse(["

【问题讨论】:

  • 像这样循环遍历行和列是非常低效的。我建议您将data.frame() 转换为矩阵,如果data.frame() 的每一列都是数字,则只需使用子集。
  • @Antonio,您能提供dput(head(yourdataset)) 和预期结果吗?

标签: r for-loop dataset nested-loops


【解决方案1】:

由于您尚未提供示例数据集,以下示例使用 mtcars

使用基础 R,rapplyifelse

rapply(mtcars,f = function(x) ifelse(x==1,0,ifelse(x>1,1,x)),how = 'replace')

                    mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4             1   1    1  1    1  1    1  0  0    1    1
Mazda RX4 Wag         1   1    1  1    1  1    1  0  0    1    1
Datsun 710            1   1    1  1    1  1    1  0  0    1    0
Hornet 4 Drive        1   1    1  1    1  1    1  0  0    1    0
Hornet Sportabout     1   1    1  1    1  1    1  0  0    1    1
...

使用dplyrcase_when

library(dplyr)
mtcars %>% mutate(across(everything(),function(x) case_when(x==1 ~ 0, x > 1 ~ 1, T ~ x )))

                    mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4             1   1    1  1    1  1    1  0  0    1    1
Mazda RX4 Wag         1   1    1  1    1  1    1  0  0    1    1
Datsun 710            1   1    1  1    1  1    1  0  0    1    0
Hornet 4 Drive        1   1    1  1    1  1    1  0  0    1    0
Hornet Sportabout     1   1    1  1    1  1    1  0  0    1    1
...

【讨论】:

  • @Antonio,您得到的解决方案是否回答了您的问题?
【解决方案2】:

我们也可以使用 data.table 执行此操作(请注意,我也在使用 mtcars 数据集)。

mtcars <- setDT(copy(mtcars))
mtcars <- mtcars[ , lapply(.SD, function(x) 0*(x==1) + 1*(x>1)), .SDcols = colnames(mtcars)]

    mpg cyl disp hp drat wt qsec vs am gear carb
 1:   1   1    1  1    1  1    1  0  0    1    1
 2:   1   1    1  1    1  1    1  0  0    1    1
 3:   1   1    1  1    1  1    1  0  0    1    0
 4:   1   1    1  1    1  1    1  0  0    1    0
 5:   1   1    1  1    1  1    1  0  0    1    1
 6:   1   1    1  1    1  1    1  0  0    1    0
 7:   1   1    1  1    1  1    1  0  0    1    1
 8:   1   1    1  1    1  1    1  0  0    1    1
 9:   1   1    1  1    1  1    1  0  0    1    1
10:   1   1    1  1    1  1    1  0  0    1    1
11:   1   1    1  1    1  1    1  0  0    1    1
12:   1   1    1  1    1  1    1  0  0    1    1
13:   1   1    1  1    1  1    1  0  0    1    1
...

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2020-06-07
    相关资源
    最近更新 更多