【问题标题】:Loop not working and not raising any error in R循环不起作用并且不会在 R 中引发任何错误
【发布时间】:2021-01-11 05:37:29
【问题描述】:

我正在处理一个 df 列表,我想为列表中每个 df 的每个 df 行的每个 df 列更改这个错字“-”。

但是,当我运行下一个代码然后取消列出以验证它是否有效时,输出保持不变的“-”插入 NA:

for(i in 1:length(df_list)){
      for(j in i){
        for(z in j){
          if(df_list[[i]][[j]][[z]] == "-"){
            return(NA)
          } else {
            df_list[[i]][[j]][[z]] 
          }
        }
      }
}

## unlist to verify ##
for(i in names(df_list)){
    assign(i, df_list[[i]], .GlobalEnv)
}

##verifying ##
df1[1, "col"]

// output //

"-"

在 R 中是否有其他对象可以做到这一点?

【问题讨论】:

  • 在 R for 循环中总是返​​回 NULL。即使您使用显式 return() 也是如此。另一方面,for结果内部的赋值将发生在调用环境中,在从控制台使用for循环的情况下,它将在globalenv()中。

标签: r list dataframe for-loop if-statement


【解决方案1】:

不需要这么多嵌套的for循环,一个简单的lapply循环会将所有数据帧中的所有"-"更改为NA

df_list <- lapply(df_list, function(x){
  is.na(x) <- x == "-"
  x
})

测试数据创建代码

f <- function(i){
  d <- data.frame(x = letters[1:5], y = 6:10, a = letters[1:5])
  d$x[sample(5, 1)] <- "-"
  d$a[sample(5, 2)] <- "-"
  d
}
df_list <- lapply(1:3, f)
rm(f)

【讨论】:

    【解决方案2】:

    tidyverse 的选项是

     library(dplyr)
     library(purrr)
     map(df_list, ~ .x %>%
                      mutate(across(everything(), na_if, "-")))
    

    【讨论】:

    • 如果他想检查所有列,他也可以使用mutate_all(na_if, "-")
    • @IvnAnt mutate_at mutate_all 正在被across 弃用。在across 中,您可以使用select_helpers,即所有列everything()。是的,他们也可以使用mutate_all
    • 如果你想要安全(尽管na_if 倾向于做正确的事情......purrr::map(df_list, ~ .x %&gt;% mutate(across(where(is.character), ~ na_if(., "-"))))
    • 我只是好奇,有没有你更喜欢across的情况?
    • @IvnAnt 我喜欢mutate_all, mutate_at 语法,因为它更紧凑。但是,across 更通用,即假设您想查找每组的行数。使用mutate_all/at,它返回多列n()。有了mutate/across,就有了灵活性,即iris %&gt;% group_by(Species) %&gt;% mutate(across(everything(), mean), n = n())
    【解决方案3】:

    这对你的目的有用吗?

    lapply(df_list,function(v) replace(v,v=="-",NA))
    

    关于代码中的嵌套for 循环,您不应使用return(NA),因为它不会为现有的data.frames 分配新值,这就是输出保持不变“-”的原因安装为 NA。

    你可以试试下面的版本

    for(i in 1:length(df_list)){
          for(j in i){
            for(z in j){
              if(df_list[[i]][[j]][[z]] == "-"){
                df_list[[i]][[j]][[z]] <- NA
              }
            }
          }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      相关资源
      最近更新 更多