1

特定の変数のカウントの列を生成したいと考えています。最も簡単な方法は、table() を使用することです。かなり少量のデータの場合、問題はないようです。

A <- data.frame(A1 = sample(1:1000, 100000, replace = TRUE))
B <- data.frame(B1 = sample(1:1000, 100000, replace = TRUE))
C <- cbind(A, B)
C$countC <- table(as.factor(C$A1))[C$A1]

summary(C$countC)
Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 65      94     101     101     108     132 

ただし、より大きなセットからテーブルを構築している場合 (現在、1:1k ではなく 1:10k からサンプリングしていることに注意してください)、構築しているデータに NA がないにもかかわらず、NA が生成されます。からのテーブル:

A <- data.frame(A1 = sample(1:10000, 100000, replace = TRUE))
B <- data.frame(B1 = sample(1:10000, 100000, replace = TRUE))
C <- cbind(A, B)
C$countC <- table(as.factor(C$A1))[C$A1]

summary(C$A1)
Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1    2512    5005    5008    7502   10000 

summary(C$countC)
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
1.00    8.00   10.00   10.18   12.00   25.00       7 

データがデータ フレーム内にない場合、問題は発生しません。

A <- sample(1:10000, 1000000, replace = TRUE)
summary(table(as.factor(A))[A])
Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
57      94     101     101     108     144 

その理由を知っている人はいますか?

4

3 に答える 3

1
set.seed(500)
A <- data.frame(A1=sample(2:1000, 100000, replace=TRUE), stringsAsFactors=FALSE)
B <- data.frame(B1=sample(1:1000, 100000, replace=TRUE), stringsAsFactors=FALSE)
C <- cbind(A,B)
C$countC <- table(as.factor(C$A1))[C$A1]
 summary(C$countC)

この例を見ると、 「要因」NAで s が発生していることがわかります。1000

summary(C[is.na(C$countC),"A1"])
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1000    1000    1000    1000    1000    1000 

あなたのA1オブジェクトは可能な限りすべての要因を埋めていないと思いますが、そうすべきだと考えた後、cbindサンプルtableの最後に到達するまでに要因を使い果たします。

> str(C$A1)
 int [1:100000] 834 726 976 469 813 207 513 926 830 712 ...
> str(as.factor(C$A1))
 Factor w/ 999 levels "2","3","4","5",..: 833 725 975 468 812 206 512 925 829 711 ...

これに対する明らかな解決策は単に使用するtable(A$A1)ことですが、この新しいデータ フレームからテーブルを作成することをお勧めします。

于 2013-05-20T08:09:10.370 に答える
1

data.table パッケージをインストールし、いくつかの準備を行った後...

require(data.table)
n0<- 1e5
n <- 1e6
DT <- data.table(A1 = sample(1:n0, n, replace = TRUE),B1 = sample(1:n0, n, replace = TRUE))

これでうまくいきます。

setkey(DT,A1)
DT[
    DT[,.N,by=A1],
    countC:=N
]

で data.table にアクセスすると、data.frames と同様にDT[i,j]、 で行を選択し、 で別の操作iを行うことができますj

DT[,.N,by=A1]すべての行を選択し (iが空白であるため)、特殊変数 を使用して各 "A1" の行をカウントします.N

列「A1」を DT のキーとして設定した後、data.table (この場合) を渡してDT[,.N,by=A1]i後者の data.table の情報をマージし直すことができます。ではj、 を使用して DT に新しい列を作成しますcountC:=Ndata.table の CRAN ページにある3 つのビネットは、これがどのように機能するかを学習するのに適した場所です。

当面の質問。ああ、元の問題が何であったかがわかったと思います。と仮定しunique(x)=c(1,2,4)ます。にアクセスしようとすると、 、およびtable(x)[x]にアクセスしようとします。テーブルの長さが 3 しかないので、最後のものは未定義です。ベクトルの長さより大きいインデックスにアクセスすると、R は常に戻ります。たとえば、 を見てください。table(x)[1]table(x)[2]table(x)[4]NA(1:3)[4]

あなたの場合、1:n0一番上にない一意の値が欠落している場合は、NAs.

于 2013-05-20T08:15:35.327 に答える
0

うまくいったと思われる解決策は

C$countC <- table(C$A1)[as.character(C$A1)]

テーブルの名前が文字である数値ベクトルでインデックスを付けていました。当たり前!

于 2013-05-21T00:07:26.453 に答える