使用data.table中的函数更新变量?

时间:2014-01-16 02:38:13

标签: r data.table

这是一个非常快速的问题,我还在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'转换为类吃?

此外,我尝试根据错误提示进行修改,但都失败了。

你能提供一些建议吗?谢谢!

1 个答案:

答案 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"))
相关问题