在 R 中的 for 循环内子集数据框

subsetting a data frame inside of a for loop in R

我有一个向量 df_list 中包含 2 个数据框名称的列表。 我想用 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() 组合)。帮助。

对于给定的数据框 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
})

此方法将 return 单个数据帧。它仍然使用列表来完成工作。

生成数据:

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

  }
}

将 NA 更改为 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))