我有2个数据框列表'包含在向量df_list
中的名称。
我想用0替换每个数据帧内的每个NA观测值。数据帧的数量不必为2,只是在这种情况下它是2。
我尝试了eval()
和assign()
的不同组合,但似乎无法使其发挥作用。理想情况下,我想做这样的事情:
df_cnt_list <- df_list[which((grepl(".*cnt.*", df_list, ignore.case = T )))]
for(df in df_cnt_list){
df[is.na(df)] <- 0
}
但这不起作用(以及我尝试过的所有eval()
和assign()
组合)。帮助
答案 0 :(得分:1)
此方法将返回单个数据帧。尽管如此,它仍然使用列表来完成工作。
生成数据:
cars <- mtcars
swiss_df <- swiss
mtcars_remove_rows <- sample(1:nrow(cars),round(nrow(cars)/10,digits=0),replace=F)
mtcars_remove_cols <- sample(1:ncol(cars),round(ncol(cars)/10,digits=0),replace=F)
for (i in 1:length(mtcars_remove_cols)) {
for (j in 1:length(mtcars_remove_rows)) {
#print (paste0(i,",",j))
#print(cars[mtcars_remove_rows[j],mtcars_remove_cols[i]])
cars[mtcars_remove_rows[j],mtcars_remove_cols[i]]<- NA
}
}
swiss_df_remove_rows <- sample(1:nrow(swiss_df),round(nrow(swiss_df)/10,digits=0),replace=F)
swiss_df_remove_cols <- sample(1:ncol(swiss_df),round(ncol(swiss_df)/10,digits=0),replace=F)
for (i in 1:length(swiss_df_remove_cols)) {
for (j in 1:length(swiss_df_remove_rows)) {
#print (paste0(i,",",j))
#print(swiss_df[swiss_df_remove_rows[j],swiss_df_remove_cols[i]])
swiss_df[swiss_df_remove_rows[j],swiss_df_remove_cols[i]]<- NA
}
}
将NAs更改为0:
df_list <- list(cars=cars,swiss_df=swiss_df)
df_list_2 <- lapply(df_list, function(x) {
x[is.na(x)] <- 0
return(x)
#print(x)
#i=i+1
}
)
rm(cars,swiss_df)
gc()
lapply(names(df_list_2), function(x) assign(x, df_list_2[[x]], envir = .GlobalEnv))
答案 1 :(得分:0)
对于给定的数据框df
,您可以使用以下方法将NA值设置为0
df[which(is.na(df), arr.ind=TRUE)] <- 0
如果您有数据框列表,例如list_of_df <- list(df1, df2)
,您可以使用for
循环更改每个数据框中的值:
for (i in 1:length(list_of_df)) {
list_of_df[[i]][which(is.na(list_of_df[[i]]), arr.ind=TRUE)] <- 0
}
或使用lapply
:
list_of_df <- lapply(list_of_df, function (df) {
df[which(is.na(df), arr.ind=TRUE)] <- 0
df
})