【问题标题】:How do I loop through columns in R?如何遍历 R 中的列?
【发布时间】:2020-09-21 03:40:56
【问题描述】:

我正在尝试清理我的代码以清理丢失的数据。我有一个包含 6 列的数据集,如果我像这样单独执行它们,则代码可以工作:

mammographic_masses <- mammographic_masses %>%
  mutate(birad = replace(birad, birad== "na", NA)) %>%
  mutate(birad = replace(birad, birad== "N/A", NA))

但是当我尝试在这样的 for 循环中执行此操作时:

for (i in ncol(mammographic_masses)){
  print(class(mammographic_masses[[i]]))
  mammographic_masses <- mammographic_masses %>%
    mutate(mammographic_masses[[,i]] = replace(mammographic_masses[[,i]], mammographic_masses[[,i]] == "na", NA)) %>%
    mutate(mammographic_masses[[,i]] = replace(mammographic_masses[[,i]], mammographic_masses[[,i]] == "N/A", NA))
}

我收到一个错误:

Error: unexpected '=' in:
"  mammographic_masses <- mammographic_masses %>%
    mutate(mammographic_masses[[,i]] ="
>     mutate(mammographic_masses[[,i]] = replace(mammographic_masses[[,i]], mammographic_masses[[,i]] == "N/A", NA))
Error: unexpected '=' in "    mutate(mammographic_masses[[,i]] ="
> }
Error: unexpected '}' in "}"

我也在阅读其他方式,例如应用等,但我想不出一种方法来循环每列

【问题讨论】:

  • for (i in 1:ncol(.))。将是第一步,就像您只迭代最后一列一样。
  • 您可能对mutate_all 感兴趣(或者,如果您已经升级到刚刚发布的 dplyr 1.0,across()
  • 另一个问题是您正在混合索引方法 - 如果输入是小标题,带有逗号的单括号 df[, i] 会给您一个 1 列小标题,或者如果输入是单列向量是一个数据框。明智的做法是使用[[ 来保证无论输入如何都能获得单列向量,但不要在[[ 中使用,,只需使用[[i]]
  • 我还有一个稍微相关的问题。如果我必须使用特定于每一列的值,那么 mutate_all 将不起作用。在这种情况下,我该怎么办?
  • @GregorThomas 我也尝试过 [[i]] 但发生了同样的错误。 mutate_all 虽然对我有用

标签: r for-loop apply data-cleaning dplyr


【解决方案1】:

我们也可以使用na_if

library(dplyr)
mammographic_masses %>%
     mutate(across(everything(), ~ na_if(na_if(., "na"), "N/A")))

数据

set.seed(2020)
n <- 10
mammographic_masses <- replicate(4, sample(c(letters[1:4], "na", "N/A"), n, TRUE))
mammographic_masses <- as.data.frame(mammographic_masses)

【讨论】:

    【解决方案2】:

    提供“新”dplyr首选across以及str_replace_all(好点@Gregor)

    library(dplyr)
    library(stringr)
    
    
    mammographic_masses %>%
      mutate(across(everything(), 
             ~ str_replace_all(., c("na" = NA_character_, "N/A" = NA_character_))))
    
    #>      V1   V2   V3   V4
    #> 1     d    b <NA>    c
    #> 2     d    b <NA> <NA>
    #> 3  <NA> <NA>    d    b
    #> 4     a <NA> <NA>    b
    #> 5     a    b    d <NA>
    #> 6     d    c    b    c
    #> 7     b    b    d <NA>
    #> 8  <NA> <NA> <NA>    d
    #> 9     a    d    d <NA>
    #> 10 <NA>    b    d <NA>
    

    与 Rui 相同的数据

    set.seed(2020)
    n <- 10
    mammographic_masses <- replicate(4, sample(c(letters[1:4], "na", "N/A"), n, TRUE))
    mammographic_masses <- as.data.frame(mammographic_masses)
    
    

    【讨论】:

      【解决方案3】:

      不要循环,而是使用mutate_all

      library(dplyr)
      
      mammographic_masses %>%
        mutate_all(function(x) {is.na(x) <- x %in% c("na", "N/A"); x})
      #     V1   V2   V3   V4
      #1     d    b <NA>    c
      #2     d    b <NA> <NA>
      #3  <NA> <NA>    d    b
      #4     a <NA> <NA>    b
      #5     a    b    d <NA>
      #6     d    c    b    c
      #7     b    b    d <NA>
      #8  <NA> <NA> <NA>    d
      #9     a    d    d <NA>
      #10 <NA>    b    d <NA>
      

      测试数据创建代码

      set.seed(2020)
      n <- 10
      mammographic_masses <- replicate(4, sample(c(letters[1:4], "na", "N/A"), n, TRUE))
      mammographic_masses <- as.data.frame(mammographic_masses)
      

      【讨论】:

      • 谢谢!应该看看不同的变异函数!谢谢
      猜你喜欢
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2016-09-19
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2010-12-09
      相关资源
      最近更新 更多