2013-07-18 3 views
1

저는 개인당 평균 과일 수를 계산하려고합니다 (평소 연습 데이터). 이 코드 줄 모두 완벽하게 잘 작동합니다tapply - NA 생성?

with(df, tapply(fruit, names, FUN = function(x) length(unique(x))))->uniques 
sum(uniques)/length(unique(df$names)) 

aggregate(df[,"fruit"], by=list(id=names), FUN = function(x) length(unique(x)))->d1 
sum(d1$x)/length(unique(df$names)) 

내 문제는 내 실제 데이터에 코드를 사용할 때 작동하지 않습니다. 내 실제 데이터는 처방 데이터이며, 나는 사람마다 고유 한 약물의 수를 의미합니다. tapply 코드를 사용하면 원래의 df에는없는 새로운 환자 ID를 만들 수 있습니다. 그것은 또한 NA 값의 1000s를 돌려 줬다. 총 코드 drug_code 열 중 하나

with(dt3, tapply(drug_code, id, FUN = function(x) length(unique(x))))->uniques  

head(uniques) 
        uniques 
Patient HAI0000001  NA 
Patient HAI0000003  NA 
Patient HAI0000008  NA 
Patient HAI0000010  NA 
Patient HAI0000014  NA 
Patient HAI0000020  NA 

table(dt3$id=="Patient HAI0000001") ##checking to see if HA10000001 occurs in original df. the dim of df are 228954 rows and 5 cols 

FALSE 
228954 

에서 누락 된 내 ID 열의 값과 없음은 내가 오류가 없습니다 :

aggregate(dt3[,"drug_code"], by=list(id=id), FUN = function(x) length(unique(x)))->d1 

Error in aggregate.data.frame(as.data.frame(x), ...) : 
    arguments must have same length 

나는 일이 뭐죠 이해하지 않습니다. 내 실제 데이터는 ID col을 가지고 있고 마약/과일 열을 가지고 있다는 점에서 나의 연습 데이터와 비슷합니다. 어느 df에도 누락 된 데이터가 없습니다. 나는 lapply가 dataframes를 위해 더 나을 것을 안다. 그러나 나는 반드시 df back을 필요로하지 않는다. 그리고 어떤 경우 든 tapply 코드는 df 인 연습 데이터에서 작동합니다. 아무도 여기에서 무슨 일이 일어나고 있는지 전혀 모른다.

연습 DF : 실제 데이터의

names<-as.character(c("john", "john", "john", "john", "john", "mary", "mary","mary","mary","mary", "jim", "sylvia","ted","ted","mary", "sylvia", "jim", "ted", "john", "ted")) 
dates<-as.Date(c("2010-07-01", "2010-09-01", "2010-11-01", "2010-12-01", "2011-01-01", "2010-08-12", "2010-11-11", "2010-05-12", "2010-12-03", "2010-07-12", "2010-12-21", "2010-02-18", "2010-10-29", "2010-08-13", "2010-11-11", "2010-05-12", "2010-04-01", "2010-05-06", "2010-09-28", "2010-11-28")) 
fruit<-as.character(c("kiwi","apple","banana","orange","apple","orange","apple","orange", "apple", "apple", "pineapple", "peach", "nectarine", "grape", "melon", "apricot", "plum", "lychee", "watermelon", "apple")) 
df<-data.frame(names,dates,fruit) 

예 :

당신이 전나무에게 단일 번호 요청하고 있습니다 귀하의 경우에는
head(dt3) 
     id   quantity date_of_claim drug_code index 
1 Patient HAI0000560  1 2009-10-15 R03AC02 2010-04-06 
2 Patient HAI0000560  1 2009-10-15 R03AK06 2010-04-06 
3 Patient HAI0000560  30 2009-10-15 R03BB04 2010-04-06 
4 Patient HAI0000560  30 2009-10-15 A02BC01 2010-04-06 
5 Patient HAI0000560  50 2009-10-15 M02AA15 2010-04-06 
6 Patient HAI0000560  30 2009-10-15 N02BE51 2010-04-06 

답변

3

: 특정 벡터 (unique(fruits))의 모든 개별 길이의 평균 내를 환자 ID. 이 shws 후 평균 함수 결과 당신이 먼저 indivdual 고유의 수와는 :

> with(df, tapply(fruit, names, function(x) length(unique(x)))) 
    jim john mary sylvia ted 
    2  5  3  2  4 
> mean (with(df, tapply(fruit, names, function(x) length(unique(x))))) 
[1] 3.2 

난 당신의 코드에서 특정 값의 봉쇄에 대한 테스트는 위의 문제가 발생했을 수 있습니다 후행 공백을 한 것으로 언급한다. "string ""string"과 같지 않습니다. 나는이 기능을 쉽게 처리 할 수 ​​있도록 내 .Rprofile 파일에 pkg::gdata에 trim 기능을 사용하는 복사본을 넣었습니다.

+0

안녕하세요 Dwin, 응답 해 주셔서 감사합니다. 후행 공백은 코드를 전송할 때 내 부분에서 실수였습니다. 문제의 원인이 아닙니다. mean 함수를 사용하는 것이 내가하는 일보다 낫다. 그러나 이것은 문제가 아니다. 문제는 tapply입니다. 이러한 모든 Nas를 만들어서는 안됩니다. 더미 데이터에 대해서는 정상적으로 작동하지만 실제 데이터에서는 작동하지 않는 이유를 알 수 없습니다. dummydata는 tapply 코드의 모든 변수가 요인 변수라는 점에서 실제 데이터와 같습니다. 실제 데이터에는 Nas가 없으므로 tapply가 이들을 만드는 이유를 알지 못합니다. – user2363642

+0

잠시만 기다려주세요. 내가 뭔가를 알아 낸 것 같아요. - - 계속 지켜봐주십시오. – user2363642

+1

'dput (head (dt3)) '을 게시하면 더 나은 도움을 줄 수 있습니다. –

1

내가 누락되었을 수 있지만 간단하지 않습니다 tapply 여기에서 작동합니까? 아래 라인은 사람

x=tapply(df$fruit,df$names,function(x){length(unique(x))}) 

마다 다른 과일의 수를 계산 그리고 mean(x) 당신에게 명에서 평균을 줄 것이다?

+0

안녕 slammaster - 답장을 보내 주셔서 감사합니다. Dwin에 대한 나의 반응을보십시오, 평균적인 기능은 제 질문이 아닙니다. 질문은 tapply가 실제 df에서 Nas를 만드는 이유를 나타냅니다. 왜 이런 일이 일어나는지 알 수 없습니다. – user2363642

+0

안녕하세요. 다시 slammaster - 알아 냈습니다. 내가 DWin과 대화 할 때 사용하는 솔루션을 확인하십시오. Funnily mean (x, na.rm = TRUE)이 너무 길어서 합계/길이를 고수하고 있습니다. 당신의 도움을 주셔서 감사합니다! – user2363642