7

R では、私を困惑させるのは常に小さなことです。

次のようなデータ フレームがあるとします。

  location   species
1  seattle   A
2  buffalo   C
3  seattle   D
4  newark    J
5  boston    Q

このフレームに、ある場所がデータ セットに出現する回数を示す列を追加すると、次のような結果が得られます。

  location   species    freq-loc
1  seattle   A          2           #there are 2 entries with location=seattle
2  buffalo   C          1           #there is 1 entry with location=buffalo
3  seattle   D          2
4  newark    J          1
5  boston    Q          1

table(data$location)を使用すると、分割表が得られることを知っています。しかし、テーブル内の各値をデータフレーム内の対応するエントリにマップする方法がわかりません。誰か助けてくれませんか?

アップデート

本当にありがとうございました!参考までに、ベンチマーク テストを実行して、merge、plyr、および ave ソリューションが互いにどのように実行されるかを比較しました。テスト セットは、元の 10 × 7mil のデータ セットの 10,000 行のサブセットです。

Unit: milliseconds
expr        min         lq     median        uq       max neval
MERGE 110.877337 111.989406 112.585420 113.51679 120.23588   100
PLYR  26.305645  27.080403  27.576580  27.87157  68.40763   100
AVE   2.994528   3.117255   3.179898   3.35834  10.02955   100
4

4 に答える 4

9

を使用した基本的な R の方法を次に示しaveます。

transform(d, freq.loc = ave(seq(nrow(d)), location, FUN=length))
于 2013-06-10T18:31:38.360 に答える
6

誰かが(醜い;))aveまたはplyr解決策をすぐに投稿すると確信していますが、ここにdata.table1つがあります:

library(data.table)
dt = data.table(your_df)

dt[, `freq-loc` := .N, by = location]
# note: using `-quotes around your var name, because of the "-" in the name
于 2013-06-10T18:19:39.557 に答える
2

マージ:

merge(data, data.frame(table(location = data$location)), by = c("location"))
# location species Freq
# 1   boston       Q    1
# 2  buffalo       C    1
# 3   newark       J    1
# 4  seattle       A    2
# 5  seattle       D    2

また、次のようなリクエストもありましたplyr

library(plyr)
join(data, data.frame(table(location = data$location)))
# Joining by: location
# location species Freq
# 1  seattle       A    2
# 2  buffalo       C    1
# 3  seattle       D    2
# 4   newark       J    1
# 5   boston       Q    1
于 2013-06-10T18:20:19.090 に答える
2

列名にダッシュを使用しようとすると、非常に苦痛になります。アンダースコアまたは「ドット」を使用することをお勧めします。

dfrm$freq_loc <- ave( as.numeric(dat[[1]]), dat[["location"]] ,
                                                     FUN=length)

最初の列のaveなしで使用しようとしましたが、驚いたことに、因子レベルに関連する不可解なエラー メッセージが表示されました。as.numeric

于 2013-06-10T19:11:53.600 に答える