2

11 変数 x 60 行のデータフレームがあります。エントリは 2 つの値の要素 (「男性」/「女性」) であり、NA が含まれています。(各行は、最大 11 人のメンバーを持つ 1 つの世帯です。したがって、列の名前は「A4M1」...「A4M11」です)。

「男性」、「女性」の合計数を集計してバープロットできるようにするための最も単純なパラダイムは何ですか? 理想的には、私の出力は数値の長さ 2 の名前付きベクトルになります。つまり、因子を因子として直接操作するため、ラベルを保持します。

私は reshape,melt,cast,stack,tabulate,table,colwise,sum,aggregate,summarise,by,plyr を試してきました...

私の現在の作業コードは次のとおりです。

> tabulate(stack(colwise(as.numeric)(myData), na.rm=TRUE)$values)
[1] 162 151

数値に強制してラベルを失いたくないので、これは悪いことです。

以下の私の答えを見てください

table(as.matrix(myData))

因子レベルの順序が失われ、ラベルのアルファベット順が返されるため、これも理想的ではありません。

tabulate()が最も適しているようです。データフレームをリストに変換するには、stack(..., na.rm=TRUE)$values不格好ですが、仕事をします。ただしstack()、因子では機能しないため理想的ではないためcolwise(as.numeric)(myData)、ラベルを破棄する で変換する必要があります。factor(..., labels=c('Male','Female'))からの出力に再適用することもできますがtabulate()、それは不格好です。それで、あなたはもっとうまくやれますか?(ケース固有のコードを書く以外に、標準的なパラダイムを使用する)

> head(myData)
    A4M1 A4M2   A4M3   A4M4   A4M5 A4M6 A4M7 A4M8 A4M9 A4M10 A4M11
1 Female Male   Male   <NA>   Male Male Male <NA> <NA>  <NA>  <NA>
2 Female Male   Male   <NA>   <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>
3 Female Male   Male   <NA>   <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>
4 Female Male Female   <NA>   <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>
5 Female Male   Male Female Female Male <NA> <NA> <NA>  <NA>  <NA>
6 Female Male   Male   <NA>   <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>
7 ...

> str(myData)
'data.frame':   60 obs. of  11 variables:
 $ A4M1 : Factor w/ 2 levels "Male","Female": 2 2 2 2 2 2 1 2 2 2 ...
 $ A4M2 : Factor w/ 2 levels "Male","Female": 1 1 1 1 1 1 1 1 1 1 ...
 $ A4M3 : Factor w/ 2 levels "Male","Female": 1 1 1 2 1 1 2 1 1 2 ...
 $ A4M4 : Factor w/ 2 levels "Male","Female": NA NA NA NA 2 NA NA 1 NA 2 ...
 $ A4M5 : Factor w/ 2 levels "Male","Female": 1 NA NA NA 2 NA NA 1 NA 2 ...
 $ A4M6 : Factor w/ 2 levels "Male","Female": 1 NA NA NA 1 NA NA NA NA NA ...
 $ A4M7 : Factor w/ 2 levels "Male","Female": 1 NA NA NA NA NA NA NA NA NA ...
 $ A4M8 : Factor w/ 2 levels "Male","Female": NA NA NA NA NA NA NA NA NA NA ...
 $ A4M9 : Factor w/ 2 levels "Male","Female": NA NA NA NA NA NA NA NA NA NA ...
 $ A4M10: Factor w/ 2 levels "Male","Female": NA NA NA NA NA NA NA NA NA NA ...
 $ A4M11: Factor w/ 2 levels "Male","Female": NA NA NA NA NA NA NA NA NA NA ...
4

2 に答える 2

1

最初にデータを非公開にするとどうなりますか? 簡単な例:

test <- data.frame( 
            A4M1=factor(c(1,2,3,1),levels=(1:3),labels=c("one","two","three")),
            A4M2=factor(c(1,2,2,1),levels=(1:3),labels=c("one","two","three"))
             )

これにより、要素がそのまま保持されます...

str(unlist(test))
 Factor w/ 3 levels "one","two","three": 1 2 3 1 1 2 2 1
 - attr(*, "names")= chr [1:8] "A4M11" "A4M12" "A4M13" "A4M14" ...

...そして、あなたが求めているテーブルの順序を示します(つまり、アルファベット順ではありません):

> table(unlist(test))

  one   two three 
    4     3     1 
于 2012-10-28T06:22:16.517 に答える
0

それを要素のデータフレームとして扱うという考えを放棄した場合は、次のことができます。

> table(as.matrix(myData))

Female   Male 
   151    162 

ただし、順序が不確定であるため、これは望ましくありません。table()レベルの番号順ではなく、ラベルのアルファベット順で並べ替えます。一般的に、それは最悪です。ここで、次の方法で回避できますrev()

> rev(table(as.matrix(myData)))

Male Female 
 248    253 
于 2012-10-28T05:19:14.680 に答える