2013-12-10 3 views
2

이 질문은이 게시물에 관련이 있습니다 give each id the same column value R하지만 그 해결책은 나를 위해 작동하지 않습니다.각 개인에 대한 첫 번째 날짜를 따기 R

저는 개인이 마약 C10. *을 얻은 최초의 날짜 인 datatable을 가지고 있습니다. 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, 클래스)] ', 당신은 무엇을 어떻게해야합니까? –

+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으로 설정하거나 약을 사용하여 새 열을 만드는 것이 좋습니다. 당신은 당신을 위해 일하는 것이 다음 있도록 .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 값이고 teh 코드는 정상적으로 작동합니다. 그냥 배우고 이해하려고 : – user2363642

+1

@ user2363642, 당신이'(또는)'를 사용 했어야 할 때'와 (&)'를 사용하는 것처럼 보입니다. 간단한 실수 –

+0

@ user2363642, 일반적인 문제 해결 팁으로 예상되는 결과를 얻지 못할 때이를 분해하고 각 세그먼트가 예상하는 조각을 제공하는지 확인하십시오. 예를 들어,'시도 3'에서'dt2 [, drugs == 'C10AA05'& drugs == 'C10AA07', by = names]'로 출력하고 –

관련 문제