循环无法正常工作,并且不会在R中引发任何错误

时间:2020-09-24 21:31:20

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

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

但是,当我运行下一个代码,然后取消列表以验证其是否有效时,输出仍为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中是否有其他对象可以这样做?

3 个答案:

答案 0 :(得分:4)

不需要太多的嵌套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)

答案 1 :(得分:4)

带有tidyverse的选项应该是

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

答案 2 :(得分:2)

这是出于您的目的吗?

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

关于代码中的嵌套for循环,请勿使用return(NA),因为它不会为现有的data.frames分配新值,这就是输出仍保留相同的“-”代表不适用。

您可以尝试以下版本

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
          }
        }
      }
}