ある列を別の列で分割して、1 人あたりの時間を取得するにはどうすればよいですか?分割方法については何も見つかりませんでした。
使いたいデータはこちら
min count2.freq
263807.0 1582
196190.5 1016
586689.0 3479
最後に、このような 3 番目の列を追加したいと思います。min / count2.freq
例えば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
うまくいけば、あなたは私のように考え、最初のバージョンの方が優れています;-)
プログラミング時に et al のシンタックス シュガーを使用しない理由はtranform()
、それらが評価を行う方法 (名前付き変数を探す) のためです。最上位 (プロンプトで、インタラクティブに作業) では、transform()
その他は問題なく動作します。しかし、関数呼び出しに埋もれたり、関数ファミリの 1 つへの呼び出し内に埋もれたりすると、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
packages は、データ ラングリングの場合に常に節約になります。目的の分割を 3 番目の変数として追加するには、使用しますmutate()
d <- mutate(d, new = min / count2.freq)