2014-03-14 42 views
2

像許多我是新來R.我有一個大的數據集(500M +行),我有FREAD成data.table logStats其中有類似如下的數據:data.table查找值和翻譯

head(logStats,15) 

        time pid mean 
1: 2014-03-10 00:00:00 998 3.570000 
2: 2014-03-10 00:00:00 11 4.090000 
3: 2014-03-10 00:00:00 345 3.380000 
4: 2014-03-10 00:05:00 998 4.866667 
5: 2014-03-10 00:05:00 11 3.677778 
6: 2014-03-10 00:05:00 345 4.487500 
7: 2014-03-10 00:10:00 345 4.833333 
8: 2014-03-10 00:10:00 998 4.333333 
9: 2014-03-10 00:10:00 11 6.977778 
10: 2014-03-10 00:15:00 345 3.900000 
11: 2014-03-10 00:15:00 998 3.200000 
12: 2014-03-10 00:15:00 11 6.030000 
13: 2014-03-10 00:20:00 998 4.550000 
14: 2014-03-10 00:20:00 11 4.030000 
15: 2014-03-10 00:20:00 345 6.060000 

還有第二個非常小的data.table(360行),它有兩列,可以將'pid'值解碼爲更友好的閱讀內容。 'pid'值可以是數字或字符。

例如:

pidLookupTable<-data.table(pid=c(998,11,345),pidName=c("Apple","Bannana","Cinnamon")) 

其產生:

pid pidName 
1: 998 Apple 
2: 11 Bannana 
3: 345 Cinnamon 

我想要的表達能夠增加data.table logStats列其具有pidName該行pid

我應該得到的東西,如:

    time pid  mean pidNames 
1: 2014-03-10 00:00:00 998 3.570000 Apple 
2: 2014-03-10 00:00:00 11 4.090000 Banana 
3: 2014-03-10 00:00:00 345 3.380000 Cinnamon 
4: 2014-03-10 00:05:00 998 4.866667 Apple 
5: 2014-03-10 00:05:00 11 3.677778 Banana 
6: 2014-03-10 00:05:00 345 4.487500 Cinnamon 
7: 2014-03-10 00:10:00 345 4.833333 Cinnamon 
8: 2014-03-10 00:10:00 998 4.333333 Apple 
9: 2014-03-10 00:10:00 11 6.977778 Banana 
10: 2014-03-10 00:15:00 345 3.900000 Cinnamon 
11: 2014-03-10 00:15:00 998 3.200000 Apple 
12: 2014-03-10 00:15:00 11 6.030000 Banana 
13: 2014-03-10 00:20:00 998 4.550000 Apple 
14: 2014-03-10 00:20:00 11 4.030000 Banana 
15: 2014-03-10 00:20:00 345 6.060000 Cinnamon 

我寫了一個函數:

pidNameLookup<-function(x) { 
    return(pidLookupTable[pidLookupTable$pid==x,name]) 
} 

然後跑去:

logStats[,pidName:=pidNameLookup(pid)] 

但這只是轉換前3個看跌期權NA爲其餘的值:

logStats[1:1000] 
       date  time pid value   timestamp mean pidName 
     1: 10-03-2014 00:00:12 998 5.5 2014-03-10 00:00:12 3.57 Apple 
     2: 10-03-2014 00:00:17 11 2.1 2014-03-10 00:00:17 4.09 Bannana 
     3: 10-03-2014 00:00:22 345 5.7 2014-03-10 00:00:22 3.38 Cinnamon 
     4: 10-03-2014 00:00:47 998 1.0 2014-03-10 00:00:47 3.57  NA 
     5: 10-03-2014 00:00:55 11 0.3 2014-03-10 00:00:55 4.09  NA 
     ---                 
     996: 10-03-2014 02:49:37 345 0.7 2014-03-10 02:49:37 5.30  NA 
     997: 10-03-2014 02:50:01 998 9.9 2014-03-10 02:50:01 5.30  NA 
     998: 10-03-2014 02:50:08 11 7.0 2014-03-10 02:50:08 7.00  NA 
     999: 10-03-2014 02:50:18 345 2.4 2014-03-10 02:50:18 2.40  NA 
    1000: 10-03-2014 02:50:48 998 0.7 2014-03-10 02:50:48 5.30  NA 

,並給我的警告消息:

Warning message: 
In pidLookupTable$pid == x 
    longer object length is not a multiple of shorter object length 

警告消息,不正確的結果意味着,我做的事情完全錯誤的。

幫助!!這讓我精神不振

+0

這是一個警告信息,而不是一個錯誤。但仍然很重要。 –

+0

@RScriv是的,它是一個警告,通過我得到的結果不是我需要的。我將用正在返回的內容的示例更新該問題。 – neurozen

回答

6

我建議你看data.tablevignette("datatable-intro"))的介紹小插曲,因爲這是data.table顯式構建的。

這會給你你想要什麼,而應該是多少,要快得多:

setkey(logStats, "pid") 
setkey(pidLookupTable, "pid") 
logStats[pidLookupTable] 
+0

非常感謝您指引我朝着正確的方向發展。你幫我找到了兩個問題。列上的類是不同的一個'character',另一個'numerical',我以前在logStats上設置了一個關鍵字,它是包含時間戳的關鍵向量。 – neurozen