这是一个非常快速的问题,我还在this link
中问了一个更复杂的问题在这个链接中,罗兰亲切地为我的问题提供了一个非常优雅的解决方案。但我想弄清楚为什么我的解决方案不起作用。
DT <- data.table(UID = paste0("UID",rep(1:5,each=2),
date = as.IDate("2012-01-01","2012-01-02","2012-01-03","2012-01-04","2012-01-05","2012-01-06","2012-02-01","2012-02-02","2012-02-03","2012-02-04"),
value = c(1:10)))
这是假数据集。
现在我想基于以下条件创建一个名为Val2的新变量:
**每行的日期是否为“2012-01-02”,“2012-02-02”。
为实现这一目标,我尝试了这个
1. f <- function(x){
test <- ifelse(x %in% as.Date(c("2012-01-02","2012-02-02")) , TRUE, FALSE)
return(test)
}
DT[,Val2:= f(date)]
但所有Val2都是真的,这显然是错误的。
正如罗兰指出我之前的问题,我尝试了另一个问题。
DT[, Val2:= sapply(date, function(x) x %in% as.Date(c("2012-01-02","2012-02-02")))]
仍然无法处理以下错误:
as.Date.default(x,...)出错: 不知道如何将'x'转换为类吃?
此外,我尝试根据错误提示进行修改,但都失败了。
你能提供一些建议吗?谢谢!
答案 0 :(得分:3)
与同一类的对象(IDate)进行比较。您也不需要在此使用ifelse
,因为它只返回%in%
的值。
DT[,val2 := date %in% as.IDate(c("2012-01-02","2012-02-02"))]
> DT
UID date value val2
1: UID1 2012-01-01 1 FALSE
2: UID1 2012-01-02 2 TRUE
3: UID2 2012-01-03 3 FALSE
4: UID2 2012-01-04 4 FALSE
5: UID3 2012-01-05 5 FALSE
6: UID3 2012-01-06 6 FALSE
7: UID4 2012-02-01 7 FALSE
8: UID4 2012-02-02 8 TRUE
9: UID5 2012-02-03 9 FALSE
10: UID5 2012-02-04 10 FALSE
DT
,在添加val2
之前:
structure(list(UID = c("UID1", "UID1", "UID2", "UID2", "UID3",
"UID3", "UID4", "UID4", "UID5", "UID5"), date = structure(c(15340L,
15341L, 15342L, 15343L, 15344L, 15345L, 15371L, 15372L, 15373L,
15374L), class = c("IDate", "Date")), value = 1:10), .Names = c("UID",
"date", "value"), row.names = c(NA, -10L), class = c("data.table",
"data.frame"))