我有数据框,其中一列必须进行修改,正确处理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)
}
答案 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)