web-dev-qa-db-ja.com

データフレームの1つの列を別の列に分割するにはどうすればよいですか?

1人あたりの時間を取得するために、1つの列を別の列に分割したかったのですが、どのように分割できますか?.

ここに私が使用したいデータがあります

     min    count2.freq
263807.0    1582
196190.5    1016
586689.0    3479

最後に、min / count2.freqの番号を持つこのような3番目の列を追加します

例:263808.0/1582 = 166.75

17
user1741021

これを行うことができる方法はたくさんあります。問題は、分割したい変数の位置をRに知らせる方法です。

想定

_d <- read.table(text = "263807.0    1582
196190.5    1016
586689.0    3479
")
names(d) <- c("min", "count2.freq")
> d
       min count2.freq
1 263807.0        1582
2 196190.5        1016
3 586689.0        3479
_

私の好きな方法

目的の部門を3番目の変数として追加するには、transform()を使用します

_> d <- transform(d, new = min / count2.freq)
> d
       min count2.freq      new
1 263807.0        1582 166.7554
2 196190.5        1016 193.1009
3 586689.0        3479 168.6373
_

基本的なRの方法

関数内でこれを行う場合(つまり、プログラミングしている場合)、上記のシュガーとインデックスを避けるのが最善です。その場合、これらのどれでもあなたが望むことをするでしょう

_## 1. via `[` and character indexes
d[, "new"] <- d[, "min"] / d[, "count2.freq"]

## 2. via `[` with numeric indices
d[, 3] <- d[, 1] / d[, 2]

## 3. via `$`
d$new <- d$min / d$count2.freq
_

これらはすべてプロンプトでも使用できますが、読みやすくなっています。

_d <- transform(d, new = min / count2.freq)
_

または

_d$new <- d$min / d$count2.freq ## or any of the above examples
_

うまくいけば、あなたは私と同じように考え、最初のバージョンはより良いです;-)

プログラミング時にtranform()などの構文糖を使用しない理由は、それらがどのように評価を行うか(名前付き変数を探すため)です。トップレベル(プロンプトで、対話的に動作)でtransform()などは問題なく動作します。しかし、関数呼び出しに埋もれたり、apply()ファミリーの関数の呼び出し内に埋もれていたり、それらが壊れたりすることがあります。

同様に、数値インデックス(上記の_## 2._)の使用には注意してください。データの順序を変更すると、間違った変数が選択されます。

交換が必要ない場合の好ましい方法

除算を行いたいだけの場合(結果をデータフレームに挿入するのではなく、with()を使用します。これにより、評価する単純な式を分離できます。

_> with(d, min / count2.freq)
[1] 166.7554 193.1009 168.6373
_

これも同等のものよりもずっときれいなコードです

_> d$min / d$count2.freq
[1] 166.7554 193.1009 168.6373
_

dを使用して、コード_min / count2.freq_を実行します。あなたの好みは私のものと異なる場合があるため、すべてのオプションを示しました。

42
Gavin Simpson

ハドリー・ウィッカム

dplyr

データの乱闘の場合、パッケージは常に節約になります。目的の部門を3番目の変数として追加するには、mutate()を使用します

d <- mutate(d, new = min / count2.freq)
1
Azam Yahya