1

私はRの初心者で、データフレーム内の値のパーセンテージを計算する可能性が必要ですが、他の列の値によって「グループ化」されることがよくあります。

メディアタイプ、バージョン、コレクション (= 年)、およびカウント (今年) を含む約 1000 行のデータ フレームがあります。それらをフィルタリングして、特定のメディアタイプのみを取得できます。

trSpdf <- trS[trS$Mediatype == 'application/pdf',]

次の出力例を取得します。

> trSpdf 

        Mediatype Version Collection      Count
39 application/pdf      -1     co2008         2.0
40 application/pdf      -1     co2009         5.0
43 application/pdf       1     co2008         1.0
44 application/pdf       1     co2009         1.0
48 application/pdf     1.1     co2008        16.0
52 application/pdf     1.2     co2008        20.0
53 application/pdf     1.2     co2009        90.0
... (continuing) ...

私が望むのは、このコレクションのすべてのバージョンと比較して、各コレクション (= 年) の各バージョンの割合を計算することです。この例では、結果は次のようになります。

5.12% of all versions in co2008 were version -1 (2.0 / total sum for co2008)
2.56% of all versions in co2008 were version 1 (1.0 / total sum for co2008)
...
93,75% of all versions in co2009 were version 1.2 (90.0 / total sum for co2009)
...

これを解決する方法についての回答を事前に感謝します。

4

2 に答える 2

1

まず、 を使用して、およびaveごとの合計数を示す列を追加します。MediatypeCollection

trS <- transform(trS, Tot.Count = ave(Count, Mediatype, Collection, FUN = sum))

次に、パーセンテージを計算する方法は非常に明白です。

trS <- transform(trS, percentage = 100 * Count/Tot.Count)

または、適切にフォーマットしたい場合 (例: "5.13%")、次を使用しますsprintf

trS <- transform(trS, percentage = paste0(sprintf("%.2f", 100 * Count/Tot.Count),
                                          "%"))
于 2013-05-24T01:15:39.563 に答える
1

次のようなことができます。

with(trSpdf, by(Version, Collection, FUN= function(x) round(prop.table(table(x))*100,2)))

FUN出力をどのように見せたいかを変更できます。

編集:これを試してください:

yearsums <- with(trSpdf, tapply(Count, Collection, sum))
mapply(FUN = function(x,y) x/yearsums[as.character(y)], trSpdf$Count, trSpdf$Collection)

しかし、もっと良い方法があると確信しています。

于 2013-05-23T14:19:12.460 に答える