0

私はいくつかの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))
4

1 に答える 1

7

結果を行列sapplyapply変換します。 as.data.frame(lapply(...))データ フレーム列をループする安全な方法です。

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

ddplyfromで少しきれいplyrです。

library(plyr)
ddply(
  df1, 
  .(id), 
  colwise(
    function(column) 
    {
      if(inherits(column, "Date")) 
      { 
        pmin(column, Sys.Date()) 
      } else column
    }
  )
)
于 2013-10-22T10:55:10.910 に答える