Я пытаюсь рассчитать среднее количество уникальных фруктов на человека (данные моей обычной практики). Это отлично работает с обеими этими строками кода:
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. он также вернул 1000 значений NA. В моем столбце id нет пропущенных значений, а в столбце 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
Для совокупного кода я получаю сообщение об ошибке:
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
Я не понимаю, что происходит. Мои реальные данные аналогичны данным моей практики в том, что они имеют столбец идентификатора и столбец наркотики/фрукты. нет пропущенных данных ни в одном df. Я знаю, что lapply лучше для фреймов данных, но мне не обязательно нужен df. И в любом случае код tapply работает с практическими данными, которые представляют собой 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