我正在处理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中是否有其他对象可以这样做?
答案 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
}
}
}
}