【问题标题】:use a loop with mutate使用带有 mutate 的循环
【发布时间】:2017-05-23 21:58:20
【问题描述】:

这个脚本运行良好

F <- mutate(F, "1" = ifelse(dt == 1,1,0))

但是,我想创建一个循环,因为我想将它应用到 130 列

我试过了,但它返回一个额外的列

for (i in 1:130) {
F <- mutate(F, "i" = ifelse(dt == i, 1, 0))
}

有人可以帮忙吗?

【问题讨论】:

  • 你能不能加个reproducible example?
  • 要将 'ifelse()' 应用到每一列,您可以使用功能基 R 例如sapply() 并避免循环。
  • 您应该查看?mutate_each 和/或?mutate_all
  • 正如@IanWesley 建议的那样,使用mutate_all 将是解决此问题的一种非常简单的方法。如果您不想应用其他列,只需在调用 mutate_all 之前将其选中即可。

标签: r for-loop dplyr


【解决方案1】:

您必须使用mutate_ 而不是mutate,这是mutate 的“标准评估”版本,这意味着您可以使用带引号的参数。代码如下:

## Sample data:
set.seed(1000)

F <- data.frame(dt = sample.int(5, 20, replace = TRUE))
## Your loop:
for (ii in 1:5){
    F <- F %>% mutate_(.dots = setNames(list(paste0("ifelse(dt == ", ii, ",1,0)")), ii))
}

head(F)
#   dt 1 2 3 4 5
# 1  2 0 1 0 0 0
# 2  4 0 0 0 1 0
# 3  1 1 0 0 0 0
# 4  4 0 0 0 1 0
# 5  3 0 0 1 0 0
# 6  1 1 0 0 0 0

【讨论】:

    【解决方案2】:

    您可以在循环中分配新列,而不是 mutate

    x <- runif(100, 0, 1)
    y <- runif(100, 0, 1)
    class <- round(runif(100, 0, 1))
    df <- data.frame(cbind(x, y, class))
    
    df <- mutate(df, "1" = ifelse(x == 1,1,0))
    
    for(i in 1:130){
      print(i)
      cola <- paste('col', i, sep= '')
      df[[cola]] <- ifelse(x == i, 1, 0)
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 2021-07-27
      • 1970-01-01
      • 2020-11-22
      • 2016-10-15
      • 2020-09-13
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多