2012-10-17 99 views
0

我是R新手,在操作某些環境監控數據時,對此問題感到困惑。如何根據另一個數據幀中的值引用一個數據幀中的值?

我有兩個數據集分別記錄實際監測時間序列和監測點信息。我將它們存儲在兩個數據幀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 

我想在monitoring與來自sites提取信息添加site.type列如下所示:

    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,它在我的i5-2400計算機上永不停止運行,內存爲16GB RAM。同樣的解決方案,以類似的情況,所以更加困惑爲什麼它不起作用在我的情況。因此,

  1. 有人可以指出問題出在哪裏嗎?
  2. 請問如何避免for在這種情況下循環,因爲它可能不會像「時髦」和高效? :)

非常感謝提前。

+0

'?merge'應該運行得更好...... –

+0

做那些2'data.frame's有相同的尺寸? – aL3xa

+0

@BenBolker謝謝你指點我正確的方向 - 如果匹配的列有不同的大寫內容(請參閱下面的@ 1月份的解決方案),是否有任何一步解決方案來「合併」兩者? – elarry

回答

3

正確的方式做它是使用merge,因爲本建議,但這裏是一個簡單的一招:

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

現在你可以使用按鍵,比如riverside可以訪問sites,例如嘗試sites[ "riverside", ]tolower()函數僅用於將RIVERSIDE轉換爲riverside。因此,你可以做

monitoring$site.type <- sites[ monitoring$site, "type" ] 
+0

有多聰明!非常感謝這個好主意 - 讀了@Ben的建議,並試圖在兩個「site」列中匹配案例(真實的「monitoring」中的site中的站點名稱通常包含多個單詞,是每個單詞的首字母大寫,比如'Williamson Park',我想保留這個格式輸出)。在你的解決方案中,我把大寫字母保存在'sites $ site'中,並使用'toupper(監視$ site)'來進行索引,並且它在一秒鐘內就完美了!謝謝! :) – elarry

1

使用merge由Ben的建議很容易

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')] 
+0

感謝您的回答,@ jilber。我還認爲,如果兩個「網站」欄中的內容具有相同的大寫字母,那麼將兩者合併將很容易。然而,在真正的「監測$站點」中,每個首字母大寫,例如「Stratford-upon-Avon Centre」,而在真實的「sites $ site」中,全部都是大寫,如示例中所示,並且我希望第一種格式的輸出。只是爲了測試,我只將兩列轉換爲小字母,並使用'site'的'merge'。在生成的數據框中,時間序列不再按順序排列。任何想法爲什麼?非常感謝。 – elarry

相關問題