【问题标题】:subsetting a data frame inside of a for loop in R在R中的for循环内对数据框进行子集化
【发布时间】:2018-06-21 22:01:17
【问题描述】:

我有一个包含在向量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() 组合)。帮助。

【问题讨论】:

  • 将实际的 data.frames 放在一个列表中(不仅仅是它们的名称)并在该列表上运行 lapply。
  • @docendodiscimus 但我希望更改原始数据框,而不是列表中的副本。
  • 你的问题是最好的例子,说明为什么你应该把它们放在一个列表中
  • 你能给我看一个示例代码吗?

标签: r for-loop subset na


【解决方案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

  }
}

将 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))

【讨论】:

    【解决方案2】:

    对于给定的数据框df,您可以使用以下方法将 NA 值设置为 0:

    df[which(is.na(df), arr.ind=TRUE)] <- 0
    

    如果您有数据框列表,例如list_of_df &lt;- 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
    })
    

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 2020-12-07
      相关资源
      最近更新 更多