假设我有一组名为N01到N99的数据帧。它们的结构相同,都有一个名为DATE的列。
假设此DATE列属于factor
类,我想将其更改为POSIXlt
。如果我打算使用类似NXX$DATE
的函数更新strptime()
列,我该如何为所有N01-N99数据帧执行此操作?
我已尝试使用lapply
,但无法在函数中使用assign
来分配给特定列。
例如,这没有用:
lapply( ls(pattern="N[0-9][0-9]"), function(x){ assign(paste(get(x),'$DATE',sep=''), strptime(get(x)$DATE),"%y/%m/%d), envir=.GlobalEnv)})
我也尝试过分配给paste(x,"['TIME']")
,但它也创建了一个新的data.frame而不是更新列。
我怎样才能实现我想要的目标?
答案 0 :(得分:3)
这是一个解决方案
# collect data frames into a list using mget
dats = mget(sprintf('N%02d', 1:99))
# loop through list of data frames and convert factor to date
dats = lapply(dats, function(x){
x$DATE = strptime(x$DATE, "%y/%m/%d")
return(x)
})
答案 1 :(得分:2)
将lapply
与list2env
一起使用。但是,您可以在lapply
中进行所有必要的分析,并将每个list
元素保存为单独的文件,甚至不使用list2env
更改原始数据集。
lst <- mget(ls(pattern="^N[0-9]+"))
list2env(
lapply(lst, function(x) {x$DATE <- strptime(x$DATE, "%Y-%m-%d") #change here
x}),
envir=.GlobalEnv)
<environment: R_GlobalEnv>
str(N01)
#'data.frame': 5 obs. of 2 variables:
#$ DATE: POSIXlt, format: "2012-01-01" "2012-01-02" ...
#$ val : num -0.212 -1.042 -1.153 0.322 -1.5
set.seed(25)
N01 <- data.frame(DATE = factor(seq(as.Date("2012-01-01"), length.out=5, by=1)), val=rnorm(5))
N02 <- data.frame(DATE = factor(seq(as.Date("2012-01-01"), length.out=5, by=1)), val=rnorm(5))
N25 <- data.frame(DATE = factor(seq(as.Date("2012-01-01"), length.out=5, by=1)), val=rnorm(5))