0

plyr は因子 [グループ化変数] の欠損レベルをスキップしますか? これは、問題を診断する際の私の最初の質問です。

患者がstrata=ruralまたはにいるデータセットがありstrata=cityます。とを比較ageしたい。treatment=Atreatment=B

たとえば、私はやろうとしています:

ddply(data.c, .(strata), function(x) t.test(age~treatment, data=x, na.rm=TRUE)

しかし、それは私に言います

t.test.formula(年齢 ~ 治療、データ = x、na.rm = TRUE) のエラー: グループ化係数には正確に 2 つのレベルが必要です

実行factor(data$strata)してfactor(data$treatment)、それぞれ 2 つのレベルしか表示されない場合 (それらはそれぞれ 2 つのラベルです。それは問題ではありませんよね?)。

plyr は、NA がグループ化係数のレベルであると考えていますか? エラーメッセージの問題は何ですか?

私はグーグルで、質問に答えるためにstackoverflowを調べてきました。私はRにかなり慣れていませんが、答えが見つかりませんでした。どんな助けでも大歓迎です。


だから私はいくつかのサンプルコードを持っています。Chase の例はうまく機能しましたが、自分のデータを使用すると、同じエラーが発生します。

dlply(data.c, .(strata), function(x) t.test(age~treatment, data=x, na.rm=TRUE同じエラーが発生しました。

これがなぜなのかわかりません。

以下は私のdata.c

        strata  age treatment
1   1   57.8630136986301    p_3
2   0   52.958904109589 p_3
3   NA  97.2438356164384    p12
4   0   88.2027397260274    p12
5   1   77.5890410958904    p12
6   1   43.9123287671233    p12
7   1   63.5260273972603    p_3
8   1   42.1890410958904    p12
9   0   52.1753424657534    p12
10  1   65.6493150684932    p12
11  0   44.9835616438356    p12
12  1   64.8849315068493    p12
13  1   57.5835616438356    p12
14  0   47.3013698630137    p12
15  0   74.0356164383562    NA
16  0   65.4986301369863    p12
17  1   83.986301369863 p12
18  0   47.4904109589041    p12
19  1   47.8630136986301    p12
20  1   58.8520547945205    p12
21  1   61.3342465753425    p12
22  1   66.841095890411 p12
23  1   55.6383561643836    p12
24  1   52.7178082191781    p12
25  1   71.4630136986301    p12
26  1   NA  p12
27  1   59.2082191780822    p12
28  1   69.8575342465753    p12
29  1   46.7397260273973    p12
30  1   53.5013698630137    p_3
31  1   41.3205479452055    p12
32  0   51.3917808219178    p_3
33  1   47.8684931506849    p12
34  1   87.654794520548 p12
35  0   75.558904109589 p12
36  1   71.2520547945205    p12
37  1   44.9808219178082    p_3
38  1   52  p_3
39  1   54.7643835616438    p_3
40  1   85.6630136986301    p_3
41  1   74.1835616438356    p_3
42  1   56.8684931506849    p_3
43  1   87.572602739726 p_3
44  1   85.0109589041096    p_3
45  1   70.0767123287671    p_3
46  0   47.2328767123288    p12
47  1   63.7972602739726    p12
48  1   85.8054794520548    p12
49  1   67.027397260274 p12
50  1   60.7342465753425    p12
51  0   61.9479452054794    p_3
52  0   86.8712328767123    p12
53  1   87.8219178082192    p12
54  1   49.9424657534247    p12
55  0   83.386301369863 p12
56  1   88.3013698630137    p12
57  1   55.7890410958904    p12
58  1   63.7616438356164    p12
59  1   55.5041095890411    p12
60  1   43.5232876712329    p12
61  1   58.8246575342466    p12
62  0   46.7397260273973    p12
63  0   74.2027397260274    p_3
64  0   51.9205479452055    p_3
65  0   78.1890410958904    p_3
66  0   78.9917808219178    p_3
4

2 に答える 2

2

エラーを再現することはできませんので、サンプルデータを提供する必要があると思います。ddply()次のような不満についてエラーが発生します。

 Error in list_to_dataframe(res, attr(.data, "split_labels")) : 
  Results must be all atomic, or all data frames

これは、からの出力がt.test()data.frameではなく、クラスのリストであるためhtestです。したがって、代わりにリストオブジェクトを返すようにplyrに指示するだけで、問題が解決します。リストから特定の値を抽出したい場合は、おそらくdata.frameを取り戻すことができます。

データの設定方法は次のとおりです。

x <- data.frame(strata = sample(letters[1:2], 100, TRUE),
                age = sample(18:65, 100, TRUE),
                treatment = sample(LETTERS[1:2], 100, TRUE))
x[sample(nrow(x), 10, FALSE), "strata"] <- NA
x[sample(nrow(x), 10, FALSE), "treatment"] <- NA

dlply()次に、代わりに関数を呼び出すだけで機能します。

out <- dlply(x, .(strata), function(x) t.test(age~treatment, data = x, na.rm=TRUE))

そして、あなたの質問に答えるために、はい-plyrは、outリストオブジェクトの長さと名前から明らかなように、NAを有効なグループとして扱っているようです。

> names(out)
[1] "a"  "b"  "NA"

私が言ったように、あなたの問題のより良い説明はより良い答えをもたらすかもしれません-しかしうまくいけば、これはあなたを正しい道に導くでしょう。

于 2012-07-12T03:37:57.540 に答える
1

plyr変数をグループ化する目的で、欠損値を別のグループとして扱います。0したがって、この例では、 、1、およびの 3 つのグループがありますNA.inform引数を追加することで、どのグループがエラーをスローしているかを確認できます。

dlply(data.c, 
      .(strata), 
      function(x) t.test(age~treatment, data=x, na.rm=TRUE), 
      .inform=TRUE)

レポート:

Error in t.test.formula(age ~ treatment, data = x, na.rm = TRUE) : 
  grouping factor must have exactly 2 levels
Error: with piece 3: 
  strata      age treatment
3     NA 97.24384       p12

実際、strataofを使用した行は 1 つしかなく、単一のデータ ポイント (または、すべてのデータ ポイントが同じグループにある場合) に対して a を実行すると、次のエラーが表示されますNAt.test

> t.test(age~treatment, data=data.c[is.na(data.c$strata),], na.rm=TRUE)
Error in t.test.formula(age ~ treatment, data = data.c[is.na(data.c$strata),  : 
  grouping factor must have exactly 2 levels

この問題を回避するdata.cには、dlply呼び出しで次のいずれかをサブセット化できます。

dlply(data.c[!is.na(data.c$strata),],
      .(strata), 
      function(x) t.test(age~treatment, data=x, na.rm=TRUE))

(これは、問題がどこにあるのかを知っていることを前提としています)、次のようになります。

$`0`

        Welch Two Sample t-test

data:  age by treatment 
t = 0.2653, df = 15.729, p-value = 0.7942
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval:
 -13.41565  17.24792 
sample estimates:
mean in group p_3 mean in group p12 
         64.22896          62.31283 


$`1`

        Welch Two Sample t-test

data:  age by treatment 
t = 0.6606, df = 18.612, p-value = 0.517
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval:
 -6.998471 13.440397 
sample estimates:
mean in group p_3 mean in group p12 
         65.50091          62.27995 


attr(,"split_type")
[1] "data.frame"
attr(,"split_labels")
  strata
1      0
2      1

または、エラーキャッチで呼び出しを保護できます。このような目的のためplyrに便利なラッパーを提供します。try_default

dlply(data.c, 
      .(strata), 
      function(x) try_default(t.test(age~treatment, data=x, na.rm=TRUE),
                              NULL))

を与える

Error in t.test.formula(age ~ treatment, data = x, na.rm = TRUE) : 
  grouping factor must have exactly 2 levels
$`0`

        Welch Two Sample t-test

data:  age by treatment 
t = 0.2653, df = 15.729, p-value = 0.7942
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval:
 -13.41565  17.24792 
sample estimates:
mean in group p_3 mean in group p12 
         64.22896          62.31283 


$`1`

        Welch Two Sample t-test

data:  age by treatment 
t = 0.6606, df = 18.612, p-value = 0.517
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval:
 -6.998471 13.440397 
sample estimates:
mean in group p_3 mean in group p12 
         65.50091          62.27995 


$`NA`
NULL

attr(,"split_type")
[1] "data.frame"
attr(,"split_labels")
  strata
1      0
2      1
3     NA

この出力には 3 つの要素があり、これには が原因NAで が設定されている要素が含まれていることに注意してください。NULLtry_default

于 2012-07-12T17:45:25.470 に答える