循环遍历类似的数据帧以使用 for 应用更改

Looping through similar dataframes to apply changes using for

我有一个数据框,其中一列必须进行修改,以正确处理 NA、字符和数字。 Dataframes 具有相似的名称,并且感兴趣的列是共享的。 我做了一个 for 循环来正确更改感兴趣列的每一行。但是我必须创建一个中间对象 "df" 才能实现这一点。 那有必要吗?或者可以直接修改原始数据框。

sheet1 <- read.table(text="
data
  15448
  something_else
  15334
  14477", header=TRUE, stringsAsFactors=FALSE)
sheet2 <- read.table(text="
data
  16448
  NA
  16477", header=TRUE, stringsAsFactors=FALSE)

sheets<-ls()[grep("sheet",ls())]

for(i in 1:length(sheets) ) {
  df<-NULL
  df<-eval(parse(text = paste0("sheet",i) ))  
  for (y in 1:length(df$data) ){
    if(!is.na(as.integer(df$data[y]))) 
    {
    df[["data"]][y]<-as.character(as.Date(as.integer(df$data[y]), origin = "1899-12-30"))
    }
  }
  assign(eval(as.character(paste0("sheet",i))),df)
}

作为@d.b。提到,考虑在数据帧列表上进行交互,尤其是在结构相似的情况下,因为您可以 运行 使用应用程序进行相同的操作,而且可以节省在全局环境中管理许多对象的费用。此外,考虑使用矢量化 ifelse 更新列。

如果您真的需要单独的数据框对象,请使用 list2env 将每个元素转换为单独的对象。下面用 suppressWarnings 包装 as.* 函数,因为你 do 想要 return NA.

sheetList <- mget(ls(pattern = "sheet[0-9]"))

sheetList <- lapply(sheetList, function(df) {
     df$data <- ifelse(is.na(suppressWarnings(as.integer(df$data))), df$data, 
                       as.character(suppressWarnings(as.Date(as.integer(df$data), 
                                                     origin = "1899-12-30"))))  
     return(df)
})

list2env(sheetList, envir=.GlobalEnv)