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))

私の問題は、実際のデータでコードを使用すると機能しないことです。私の実際のデータは処方データであり、1 人あたりの固有の薬の平均数が必要です。Tapply コードを使用すると、元の df には存在しない新しい患者 ​​ID が作成されるようです。また、数千の 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 列があり、drug/fruit 列があるという点で私の実践データに似ています。どちらの 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
4

2 に答える 2

3

あなたの場合、単一の数値を求めています:(unique(fruits))患者 ID 内の特定のベクトルのすべての個々の長さの平均です。これにより、最初に個々の一意のカウントが表示され、次に平均関数の結果が表示されます。

> 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"pkg::gdataこの可能性を処理しやすくするために、.Rprofile ファイルにトリム関数の使用のコピーを入れました。

于 2013-07-18T16:40:56.427 に答える
1

私は何かが欠けているかもしれませんが、ここでは単純なtapply作業ではありませんか? 以下の行は、1 人あたりのさまざまな果物の数を計算します。

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

そして、mean(x)人々全体の平均を教えてくれますか?

于 2013-07-18T16:40:57.817 に答える