3

次のようなRのデータフレームがあります。実際、私の実際の「df」データフレームは、ここにあるものよりもはるかに大きいですが、誰も混乱させたくないので、可能な限り単純化しようとしています。

これがデータフレームです。

id <-c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3)   
a <-c(3,1,3,3,1,3,3,3,3,1,3,2,1,2,1,3,3,2,1,1,1,3,1,3,3,3,2,1,1,3)
b <-c(3,2,1,1,1,1,1,1,1,1,1,2,1,3,2,1,1,1,2,1,3,1,2,2,1,3,3,2,3,2)
c <-c(1,3,2,3,2,1,2,3,3,2,2,3,1,2,3,3,3,1,1,2,3,3,1,2,2,3,2,2,3,2)
d <-c(3,3,3,1,3,2,2,1,2,3,2,2,2,1,3,1,2,2,3,2,3,2,3,2,1,1,1,1,1,2)
e <-c(2,3,1,2,1,2,3,3,1,1,2,1,1,3,3,2,1,1,3,3,2,2,3,3,3,2,3,2,1,3)

df <-data.frame(id,a,b,c,d,e)
df

基本的に私がやりたいことは、各列(a、b、c、d、e)および各IDグループ(1、2、3)の数字の出現を取得することです(この後者のグループ化については、私の列「id」を参照してください')。

したがって、列 'a' と ID 番号 '1' (後者については列 'id' を参照) の場合、コードは次のようになります。

as.numeric(table(df[1:10,2]))

##The results are:
[1] 3 7

私の結果を簡単に説明すると、列 'a' (および列 'id' に番号 '1' を持つレコードのみ) で、番号 '1' が 3 回発生し、番号 '3' が 7 回発生したと言えます。

繰り返しますが、別の例を示します。列 'a' および ID 番号 '2' の場合 (後者のグループ化については、列 'id' を再度参照してください):

as.numeric(table(df[11:20,2]))

##After running the codes the results are: 
[1] 4 3 3

もう一度少し説明しましょう: 列 'a' で、列 'id' に番号 '2' を持つ観測のみに関して) 番号 '1' が 4 回発生し、番号 '2' が 3 回発生し、番号 '2' が 3 回発生したと言えます。 「3」が 3 回発生しました。

これが私がやりたいことです。カスタム定義されたサブセットごとに数値の出現を計算します (そして、これらの値をデータ フレームに収集します)。難しい作業ではないことはわかっていますが、問題は、入力「df」データフレームを定期的に変更する必要があるため、行と列の総数が時間の経過とともに変化する可能性があることです...

これまでに行ったことは、次のように「df」データフレームを列で分離したことです。

for (z in (2:ncol(df))) assign(paste("df",z,sep="."),df[,z])

したがって、df.2 は df$a を参照し、df.3 は df$b に等しく、df.4 は df$c に等しくなります。しかし、私は今本当に立ち往生しており、先に進む方法がわかりません…</ p>

この問題を解決する適切な「自動的な」方法はありますか?

4

5 に答える 5

5

どうですか-

> library(reshape)

> dftab <- table(melt(df,'id'))
> dftab
, , value = 1

   variable
id  a b c d e
  1 3 8 2 2 4
  2 4 6 3 2 4
  3 4 2 1 5 1

, , value = 2

   variable
id  a b c d e
  1 0 1 4 3 3
  2 3 3 3 6 2
  3 1 4 5 3 4

, , value = 3

   variable
id  a b c d e
  1 7 1 4 5 3
  2 3 1 4 2 4
  3 5 4 4 2 5

したがって、列「a」およびグループ「1」の「3」の数を取得するには、次のようにすることができます。

> dftab[3,'a',1]
[1] 4
于 2011-03-17T12:16:25.303 に答える
2

tapplyとを組み合わせapplyて、必要なデータを作成できます。

tapply(df$id,df$id,function(x) apply(df[id==x,-1],2,table))

ただし、 のように、グループ化にすべての要素が含まれていない場合、結果は適切なテーブル (マトリックス) ではなく、1aそのグループのリストになります。id

$`1`
$`1`$a

1 3 
3 7 

$`1`$b

1 2 3 
8 1 1 

$`1`$c

1 2 3 
2 4 4 

$`1`$d

1 2 3 
2 3 5 

$`1`$e

1 2 3 
4 3 3 


$`2`
  a b c d e
1 4 6 3 2 4
2 3 3 3 6 2
3 3 1 4 2 4

$`3`
  a b c d e
1 4 2 1 5 1
2 1 4 5 3 4
3 5 4 4 2 5
于 2011-03-17T12:44:07.367 に答える
0

あなたはデータをどのように望むかを言いませんでした。関数は、byあなたが好きな出力を与えるかもしれません。

by(df, df$id, function(x) lapply(x[,-1], table))
于 2014-05-26T14:52:01.517 に答える
0

それを行う方法は aggregate関数を使用することですが、データフレームに列を追加する必要があります

> df$freq <- 0
> aggregate(freq~a+id,df,length)
  a id freq
1 1  1    3
2 3  1    7
3 1  2    4
4 2  2    3
5 3  2    3
6 1  3    4
7 2  3    1
8 3  3    5

もちろん、それを行う関数を書くことができるので、頻繁に行う方が簡単で、実際のデータ フレームに列を追加する必要はありません。

> frequency <- function(df,groups) {
+   relevant <- df[,groups]
+   relevant$freq <- 0
+   aggregate(freq~.,relevant,length)
+ }
> frequency(df,c("b","id"))
  b id freq
1 1  1    8
2 2  1    1
3 3  1    1
4 1  2    6
5 2  2    3
6 3  2    1
7 1  3    2
8 2  3    4
9 3  3    4
于 2014-03-31T21:46:09.960 に答える
0

誰かがこれよりもエレガントなソリューションを持っていると確信していますが、単純な関数と一緒にパッケージdlplyからまとめることができます。plyr

ColTables <- function(df) {
  counts <- list()
  for(a in names(df)[names(df) != "id"]) {
    counts[[a]] <- table(df[a])
  }
  return(counts)
}

results <- dlply(df, "id", ColTables)

これにより、リストが返されます。リストの最初の「レイヤー」は id 変数になります。2 番目は、tableその id 変数の各列の結果です。例えば:

> results[['2']]['a']
$a

1 2 3 
4 3 3 

上記の例では、id 変数 = 2、列 = a の場合。

于 2011-03-17T10:51:55.863 に答える