我正在處理一些Date
列,並試圖清理明顯不正確的日期。我已經使用safe.ifelse
功能here編寫了一個函數。R sapply vs apply lapply + as.data.frame
這裏是我的玩具數據集:
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))
兩者都轉換爲矩陣或數組。使用'lapply',然後對結果使用'do.call(data.frame,output)'。 –