使用lapply更新列

时间:2014-10-07 04:36:44

标签: r

假设我有一组名为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而不是更新列。

我怎样才能实现我想要的目标?

2 个答案:

答案 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)

lapplylist2env一起使用。但是,您可以在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))