我正在使用一些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}}
答案 0 :(得分:7)
sapply
和apply
都将结果转换为矩阵。 as.data.frame(lapply(...))
是一种循环数据框列的安全方法。
as.data.frame(
lapply(
df1,
function(column)
{
if(inherits(column, "Date"))
{
pmin(column, Sys.Date())
} else column
}
)
)
来自ddply
的{{1}}更加清晰。
plyr