1人あたりの時間を取得するために、1つの列を別の列に分割したかったのですが、どのように分割できますか?.
ここに私が使用したいデータがあります
min count2.freq
263807.0 1582
196190.5 1016
586689.0 3479
最後に、min / count2.freq
の番号を持つこのような3番目の列を追加します
例:263808.0/1582 = 166.75
これを行うことができる方法はたくさんあります。問題は、分割したい変数の位置を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
_
関数内でこれを行う場合(つまり、プログラミングしている場合)、上記のシュガーとインデックスを避けるのが最善です。その場合、これらのどれでもあなたが望むことをするでしょう
_## 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
_を実行します。あなたの好みは私のものと異なる場合があるため、すべてのオプションを示しました。
ハドリー・ウィッカム
dplyr
データの乱闘の場合、パッケージは常に節約になります。目的の部門を3番目の変数として追加するには、mutate()
を使用します
d <- mutate(d, new = min / count2.freq)