web-dev-qa-db-ja.com

行ごとの比率を計算する

私はデータフレームを持っています:

x <- data.frame(id = letters[1:3], val0 = 1:3, val1 = 4:6, val2 = 7:9)
#   id val0 val1 val2
# 1  a    1    4    7
# 2  b    2    5    8
# 3  c    3    6    9

各行内で、各値に対応する比率(比率)を計算したいと思います。例えば。列「val0」の値について、行ごとのval0 /(val0 + val1 + val2)を計算します。

必要な出力:

  id     val0  val1   val2
1  a    0.083  0.33   0.583
2  b    0.133  0.33   0.533
3  c    0.167  0.33   0.5

誰かがこれを行うための最良の方法を教えてもらえますか?ここでは3列だけですが、列がたくさんある可能性があります。

17
Rachit Agrawal

そして別の選択肢(これはほとんどsweepのきれいなバージョンですが)... _prop.table_:

_> cbind(x[1], prop.table(as.matrix(x[-1]), margin = 1))
  id       val0      val1      val2
1  a 0.08333333 0.3333333 0.5833333
2  b 0.13333333 0.3333333 0.5333333
3  c 0.16666667 0.3333333 0.5000000
_

_?prop.table_のヘルプファイルの「説明」セクションから:

マージンの長さがゼロの場合、x/sum(x)を取得することを除いて、これは初心者にとっては実際にはsweep(x, margin, margin.table(x, margin), "/")です。

そのため、これは@Jilberのソリューションと非常によく似ていることがわかります。

そして... R開発者が私たちの初心者に配慮するのは素晴らしいことですよね? :)

11

以下はトリックを行う必要があります

cbind(id = x[, 1], x[, -1]/rowSums(x[, -1]))
##   id       val0      val1      val2
## 1  a 0.08333333 0.3333333 0.5833333
## 2  b 0.13333333 0.3333333 0.5333333
## 3  c 0.16666667 0.3333333 0.5000000
13
Chinmay Patil

sweepを使用する別の方法

sweep(x[,-1], 1, rowSums(x[,-1]), FUN="/")
        val0      val1      val2
1 0.08333333 0.3333333 0.5833333
2 0.13333333 0.3333333 0.5333333
3 0.16666667 0.3333333 0.5000000
7
Jilber Urbina

管理人パッケージの関数adorn_percentages()はこれを行います。

_library(janitor)
x %>% adorn_percentages()
 id       val0      val1      val2
  a 0.08333333 0.3333333 0.5833333
  b 0.13333333 0.3333333 0.5333333
  c 0.16666667 0.3333333 0.5000000
_

これはx %>% adorn_percentages(denominator = "row")と同等ですが、_"row"_がデフォルトの引数であるため、この場合は必要ありません。 _%>%_パイプなしで使用したい場合は、同等の呼び出しはadorn_percentages(x)です。

免責事項:管理人パッケージを作成しましたが、これを投稿するのが適切だと感じています。この関数は、コードを読みやすくしながらこのタスクを正確に実行するように構築されており、パッケージはCRANからインストールできます。

5
Sam Firke