0

長いリストに大量のデータセットが保存されています。これは最初の6つのレコードの例です。

A <- list(c("JAMES","CHARLES","JAMES","RICHARD"),  
c("JOHN","ROBERT","CHARLES"),  
c("CHARLES","WILLIAM","CHARLES","MICHAEL","WILLIAM","DAVID","CHARLES","WILLIAM"),  
c("CHARLES"),  
c("CHARLES","CHARLES"),  
c("MATTHEW","CHARLES","JACK"))  

各レコードに固有の各用語が出現する相対度数と、各用語が出現するレコード数の合計の比率を計算したいと思います。

次のように、分子、つまり各レコードで各一意の用語が発生する相対頻度の合計を計算します。

> B <- lapply(A, function(x)table(x)/length(x))  
> aggregate(unlist(B), list(names(unlist(B))), FUN=sum)  
Group.1         x  
1  CHARLES 3.2916667  
2    DAVID 0.1250000  
3     JACK 0.3333333  
4    JAMES 0.5000000  
5     JOHN 0.3333333  
6  MATTHEW 0.3333333  
7  MICHAEL 0.1250000  
8  RICHARD 0.2500000  
9   ROBERT 0.3333333  
10 WILLIAM 0.3750000  

分母の計算方法、つまり各用語が正しく表示されるレコード数はわかりませんが。データセットで各項が発生する数を計算する方法しか知りません。

> table(unlist(A))  

CHARLES   DAVID   JACK   JAMES    JOHN MATTHEW MICHAEL RICHARD  ROBERT WILLIAM  
   9       1       1       2       1       1       1       1       1       3  

ただし、一部の用語はレコード内で複数回出現するため、次のような結果を得るために、これらの繰り返しを省略したいと思います。

CHARLES   DAVID   JACK   JAMES    JOHN MATTHEW MICHAEL RICHARD  ROBERT WILLIAM  
   6       1       1       1       1       1       1       1       1       1  

これはどのように達成できますか?
私の例に基づいて、次のような最終出力を取得したいと思います。

Group.1         x  
1  CHARLES 0.5486111  
2    DAVID 0.1250000  
3     JACK 0.3333333  
4    JAMES 0.5000000  
5     JOHN 0.3333333  
6  MATTHEW 0.3333333  
7  MICHAEL 0.1250000  
8  RICHARD 0.2500000  
9   ROBERT 0.3333333  
10 WILLIAM 0.3750000  

では、各用語が表示されるレコード数、つまり分母と比率自体をどのように計算できますか?

よろしくお願いします!

4

2 に答える 2

1

集計するときは、の代わりに:sumを使用してください。mean

aggregate(unlist(B), list(names(unlist(B))), FUN=mean)  
#    Group.1         x
# 1  CHARLES 0.5486111
# 2    DAVID 0.1250000
# 3     JACK 0.3333333
# 4    JAMES 0.5000000
# 5     JOHN 0.3333333
# 6  MATTHEW 0.3333333
# 7  MICHAEL 0.1250000
# 8  RICHARD 0.2500000
# 9   ROBERT 0.3333333
# 10 WILLIAM 0.3750000
于 2012-09-18T16:45:20.833 に答える
0
B <- lapply(A, unique)
B
table(unlist(B))

CHARLES   DAVID    JACK   JAMES    JOHN MATTHEW MICHAEL RICHARD  ROBERT WILLIAM 
      6       1       1       1       1       1       1       1       1       1 

以前の投稿から(実際にはuser0815を引用する必要があります)。そのテーブルコールの中にユニークなものを貼り付けてください。

 BL <- lapply(A, function(x)table(unique(x))/length(x))
 ## turn list into a vector
 B <- unlist(BL)

 aggregate(B, list(names(B)), FUN=sum)
#------------
   Group.1         x
1  CHARLES 2.5416667
2    DAVID 0.1250000
3     JACK 0.3333333
4    JAMES 0.2500000
5     JOHN 0.3333333
6  MATTHEW 0.3333333
7  MICHAEL 0.1250000
8  RICHARD 0.2500000
9   ROBERT 0.3333333
10 WILLIAM 0.1250000
于 2012-09-18T16:07:32.133 に答える