首页 文章

tapply - 创建NA?

提问于
浏览
1

我正在尝试计算每人独特水果的平均数量(我的惯常做法数据) . 这适用于以下两行代码:

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 . 它还给出了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

我不明白发生了什么事 . 我的真实数据类似于我的练习数据,因为它有一个id col并且有一个药物/水果专栏 . df中没有丢失的数据 . 我知道lapply对数据帧更好,但我不一定需要df . 在任何情况下,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

2 回答

  • 1

    在你的情况下,你要求一个数字:患者身份内特定病媒的所有个体长度的平均值 (unique(fruits)) . 这首先会向您发送单独的唯一计数,然后是平均函数结果:

    > 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函数的副本,以便我更容易处理这种可能性 .

  • 3

    我可能会遗漏一些东西,但这不是一个简单的工作吗?下面的行计算每人不同水果的数量

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

    然后 mean(x) 会给你一个人的平均值吗?

相关问题