R sapply vs apply vs lapply + as.data.frame

时间:2013-10-22 10:46:40

标签: r date plyr apply lapply

我正在使用一些Date列并尝试清除显然不正确的日期。我使用safe.ifelse提到的df1 <- data.frame(id = 1:25 , month1 = seq(as.Date('2012-01-01'), as.Date('2014-01-01'), by = 'month' ) , month2 = seq(as.Date('2012-01-01'), as.Date('2014-01-01'), by = 'month' ) , month3 = seq(as.Date('2012-01-01'), as.Date('2014-01-01'), by = 'month' ) , letter1 = letters[1:25] ) 函数编写了一个函数。

这是我的玩具数据集:

df1$month1 <- safe.ifelse(df1$month1 > as.Date('2013-10-01'), as.Date('2013-10-01'), df1$month1)

这适用于单个列:

Date

由于我有多个列,我想使用一个函数并申请同时处理所有capDate <- function(x){ today1 <- Sys.Date() safe.ifelse <- function(cond, yes, no){ class.y <- class(yes) X <- ifelse(cond,yes,no) class(X) <-class.y; return(X)} x <- safe.ifelse(as.Date(x) > as.Date(today1), as.Date(today1), as.Date(x)) } 列:

sapply()

但是当我尝试使用df1[,dateCols1] <- sapply(df1[,dateCols1], capDate)

apply()

df1[,dateCols1] <- apply(df1[,dateCols1],2, capDate))

Date

Date列失去了lapply()格式。我发现解决此问题的唯一方法是使用data.frame()然后转换回df1[,dateCols1] <- as.data.frame(lapply(df1[,dateCols1], capDate)) 。谁能解释一下呢?

{{1}}

1 个答案:

答案 0 :(得分:7)

sapplyapply都将结果转换为矩阵。 as.data.frame(lapply(...))是一种循环数据框列的安全方法。

as.data.frame(
  lapply(
    df1, 
    function(column) 
    {
      if(inherits(column, "Date")) 
      {
        pmin(column, Sys.Date())
      } else column
    }
  )
)

来自ddply的{​​{1}}更加清晰。

plyr