0

私はRを初めて使用し、環境監視データを操作するときにこの問題に戸惑っています。

実際のモニタリング時系列とモニタリング サイト情報をそれぞれ記録する 2 つのデータセットがあります。それらを2つのデータフレームに保存しましmonitoringsites

monitoring:

                  date       site obs
 1 2001-01-01 10:00:00  riverside  NA
 2 2001-01-01 11:00:00  riverside  52
 3 2001-01-01 12:00:00  riverside  52
 4 2001-01-01 13:00:00  riverside  56
 5 2001-01-01 10:00:00       dorm  52
 6 2001-01-01 11:00:00       dorm  64
 7 2001-01-01 12:00:00       dorm  76
 8 2001-01-01 13:00:00       dorm  80
 9 2001-01-01 10:00:00        kfc  78
10 2001-01-01 11:00:00        kfc  74
11 2001-01-01 12:00:00        kfc  66
12 2001-01-01 13:00:00        kfc  68

sites:

        site       type
 1      DORM   suburban
 2       KFC      urban
 3 RIVERSIDE      rural

以下に示すように、抽出された情報を含むsite.type列を追加したいと思います。monitoringsites

                  date       site obs site.type
 1 2001-01-01 10:00:00  riverside  NA     rural
 2 2001-01-01 11:00:00  riverside  52     rural
 3 2001-01-01 12:00:00  riverside  52     rural
 4 2001-01-01 13:00:00  riverside  56     rural
 5 2001-01-01 10:00:00       dorm  52  suburban
 6 2001-01-01 11:00:00       dorm  64  suburban
 7 2001-01-01 12:00:00       dorm  76  suburban
 8 2001-01-01 13:00:00       dorm  80  suburban
 9 2001-01-01 10:00:00        kfc  78     urban
10 2001-01-01 11:00:00        kfc  74     urban
11 2001-01-01 12:00:00        kfc  66     urban
12 2001-01-01 13:00:00        kfc  68     urban

grep()次のコマンドで試しました:

for (i in 1:nrow(monitoring)) {
  monitoring$site.type[i] <- as.character(sites$type[grep(monitoring$site[i], sites$site, ignore.case = T)])
}

のこの小さなサンプル セットでは問題なく動作しましたmonitoring。ただし、654,525 レコードの実際のデータセットに適用すると、16 GB RAM を搭載した i5-2400 コンピューターでの実行が停止することはありませんでした...

stackoverflow に関する既存の質問を検索しようとしたところ、同様のシナリオに対して同じ解決策を提供する回答がいくつか見つかりました。したがって、

  1. 誰かが問題がどこにあるかを親切に指摘できますか?
  2. forこの場合、「ファッショナブル」で効率的ではない可能性があるため、ループを回避する方法を尋ねてもよろしいですか? :)

よろしくお願いします。

4

2 に答える 2

3

ベンが提案したように、それを行う適切な方法は を使用することですmergeが、ここに簡単なトリックがあります:

rownames( sites ) <- tolower( sites$site )

これで、 trysitesなどのキーを使用してアクセスできます。関数は に変換するためだけに使用されます。したがって、次のことができますriversidesites[ "riverside", ]tolower()RIVERSIDEriverside

monitoring$site.type <- sites[ monitoring$site, "type" ]
于 2012-10-17T16:55:02.543 に答える
1

mergeベンが提案したように使用するのは簡単です

monitoring
sites$site <- factor(tolower(sites$site)) # cols are unordered

merge(monitoring, sites, by='site')

# fixing col order...
merge(monitoring, sites, by='site')[,c('date', 'site', 'obs', 'type')] 
于 2012-10-17T18:15:57.373 に答える