22

ある列を別の列で分割して、1 人あたりの時間を取得するにはどうすればよいですか?分割方法については何も見つかりませんでした。

使いたいデータはこちら

     min    count2.freq
263807.0    1582
196190.5    1016
586689.0    3479

最後に、このような 3 番目の列を追加したいと思います。min / count2.freq

例えば263808.0/1582 = 166.75

4

2 に答える 2

47

これを行う方法はたくさんあります。問題は、分割したい変数の位置を 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

うまくいけば、あなたは私のように考え、最初のバージョンの方が優れています;-)

プログラミング時に 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。あなたの好みは私のものとは異なるかもしれないので、すべてのオプションを示しました。

于 2012-10-22T14:17:42.040 に答える
3

ハドリー・ウィッカム

dplyr

packages は、データ ラングリングの場合に常に節約になります。目的の分割を 3 番目の変数として追加するには、使用しますmutate()

d <- mutate(d, new = min / count2.freq)
于 2015-10-16T06:17:36.033 に答える