在R中的for循环内对数据帧进行子集化

时间:2018-01-12 12:26:37

标签: r for-loop subset na

我有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()组合)。帮助

2 个答案:

答案 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
})