2014-01-16 23 views
2

這是一個非常簡單的問題,我也問this link使用data.table中的函數更新變量?

一個比較複雜的一個在這個環節,羅蘭好心給了一個非常優雅的解決我的問題。但我想弄清楚爲什麼我的解決方案無法正常工作。

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

你的代碼來構建'DT'的格式不正確。請修復它。 –

+0

謝謝馬修:)已經修好 – Bigchao

+0

我不同意。從問題粘貼到您的R解釋器中。 –

回答

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")) 
+0

它的工作,非常感謝! – Bigchao