2013-12-10 50 views
2

這個問題是關係到這個帖子give each id the same column value R而是根據解決方案的第一次約會有沒有爲我工作。採摘每個單獨的R

我有一個數據表,其中指數是第一次約會,一個人得到了藥物C10。*?在2010-04-01和2010-09-30之間的時期:

names drugs  dates  index 
1: mary C10AA07 2009-10-01   NA 
2: mary C09AA03 2010-06-01   NA 
3: mary C10AA07 2010-07-01 2010-07-01 
4: mary A02BC01 2010-07-01   NA 
5: mary C10AA07 2010-07-24 2010-07-01 
6: tom C10AA05 2009-12-01   NA 
7: tom C10AA05 2010-04-06 2010-04-06 
8: tom C07AB03 2010-05-12   NA 
9: tom C10AA05 2010-08-01 2010-04-06 

,我想給她瑪麗指標數據在列「索引」的所有行。和湯姆一樣。所以輸出是這樣的:

names drugs  dates  index 
1: mary C10AA07 2009-10-01 2010-07-01 
2: mary C09AA03 2010-06-01 2010-07-01 
3: mary C10AA07 2010-07-01 2010-07-01 
4: mary A02BC01 2010-07-01 2010-07-01 
5: mary C10AA07 2010-07-24 2010-07-01 
6: tom C10AA05 2009-12-01 2010-04-06 
7: tom C10AA05 2010-04-06 2010-04-06 
8: tom C07AB03 2010-05-12 2010-04-06 
9: tom C10AA05 2010-08-01 2010-04-06 

這正是問題是在上面的鏈接張貼。這些都是我以前用過的代碼行,但每個代碼給我收拾剛纔的所有NA爲索引值,否則並沒有改變我的DT2

嘗試1:

dt2[, index := index[grepl('^C10.*?', as.character(dt2$drugs))& dt2$dates>="2010-04-01" & dt2$dates<"2010-10-01"][1], by = names]  
dt2 

嘗試2:

dt2[, index := index[grepl('^C10.*?', as.character(dt2$drugs))[1], by = names]) 
dt2 

我無法理解發生了什麼,代碼爲什麼不起作用。如果任何人都可以擺脫這一點,這將是偉大的。謝謝。

嘗試3:

dt2[, index := index[drugs == 'C10AA05' & drugs=='C10AA07'][1], by = names] 
dt2 
+0

嘗試'dt2 [,sapply(.SD,class)]',您會得到什麼? –

+0

日期和索引都設置爲日期。名稱藥物日期索引 「因素」「因素」「日期」「日期」 – user2363642

回答

3

通過你所描述的,如果你的指數尚未填補,使用此:

dt2[, index := min(dates[grepl("^C10", drugs)], na.rm=TRUE), by=names] 

如果索引已經具有正確的價值,你是隻是試圖填充NA,請使用以下代替,因爲它會更快

> dt2[, index := index[!is.na(index)][[1]], by=names] 
> dt2 
    names drugs  dates  index 
1: mary C10AA07 2009-10-01 2010-07-01 
2: mary C09AA03 2010-06-01 2010-07-01 
3: mary C10AA07 2010-07-01 2010-07-01 
4: mary A02BC01 2010-07-01 2010-07-01 
5: mary C10AA07 2010-07-24 2010-07-01 
6: tom C10AA05 2009-12-01 2010-04-06 
7: tom C10AA05 2010-04-06 2010-04-06 
8: tom C07AB03 2010-05-12 2010-04-06 
9: tom C10AA05 2010-08-01 2010-04-06 
> 

如果你將要經常這樣做,我會建議設置關鍵drugs甚至創建與drugid新列。請注意,您可以使用.SD中的密鑰,因此以下內容適用於您:

dt2[, drugid := substr(drugs, 1, 3)] 
setkey(dt2, drugid) 

## HAVE A LOOK AT THE OUTPUT 
dt2[, .SD[.("C10"), min(dates)]] 
dt2[, .SD[.("C10"), min(dates)], by=names] 
dt2[, .SD[.("C10"), min(dates)]$V1, by=names] 
dt2[, index := .SD[.("C10"), min(dates)]$V1, by=names] 
+0

是的,這是有效的。非常感謝。你知道爲什麼我上面試過的代碼不起作用嗎?我的第一個傾向就是說它與NA值有關,但在這個例子中,我給出的鏈接有na值和代碼工作正常。只是試圖學習和理解:) – user2363642

+1

@ user2363642,當你應該使用'或(|)'時,看起來你正在使用'和(&)'。簡單的錯誤 –

+0

@ user2363642,作爲一般的故障排除提示,當你沒有得到你期望的結果時,把它分解下來,看看每個段是否給你你想要的部分。例如,在'attempt3',我將削減下來到'DT2 [,藥物==「C10AA05」和毒品==「C10AA07」,由=名稱]',並期待在該輸出 –