循环使用类似的数据框以使用for应用更改

时间:2017-02-10 17:51:38

标签: r loops assign

我有数据框,其中一列必须进行修改,正确处理NAs,字符和数字。数据框具有相似的名称,并且共享感兴趣的列。 我做了一个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)
}

1 个答案:

答案 0 :(得分:1)

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

如果您确实需要单独的数据框对象,请使用list2env将每个元素转换为单独的对象。下面用suppressWarnings包含as.*个函数,因为你想要返回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)