2014-01-20 16 views
1

我想通過一個列表來循環使用子集data.table並通過幾行代碼運行結果。如果沒有for循環,使用變量子操作是完美的,但是當包含循環時它不能按預期工作。我想這個問題是由數據類型或範圍造成的。R:使用for循環和過濾器data.table

下面的代碼工作完美:

dt <- data.table(mpg) 
list <- levels(dt$manufacturer) 

dt[manufacturer==list[3]] 

如果我再通過列表嘗試循環使用for循環:更新的代碼 - 解決]

for (var in list) { 
    subs <- data.table(melt(dt[manufacturer==var, list(model, hwy, cty)], id.vars='model')) 

    png(paste(var, 'png', sep='.')) 
    print(ggplot(subs, aes(model, value, col=variable)) + geom_point()) 
    dev.off() 
} 

我不明白任何東西。

對我來說,代碼部分看起來完全相同,應該同樣工作。有沒有人有什麼建議可能會導致我沒有得到任何第二次過濾?任何幫助表示讚賞。

+1

,如果你對你的最終目標闡述它一定會覺得很有益的。你想要做什麼?你最終的任務只是「打印」每個子集? – Arun

+0

我想我的例子是足夠徹底的,因爲我想要使用數據表的子集,但不使用_apply或其他方法 - 如果這是你在之後。當我對錶格進行子集化時,我使用結果打印圖表。由於有很多子集,就像所有mpg數據集的製造商一樣,我認爲循環是最乾淨的方法。 – sgunnars

+0

IIUC,那麼慣用的方法是'dt [,,by = manufacturer]' – Arun

回答

4

這是一個很常見的問題。檢查的區別:

for (i in 1:5) {i} 
# no output 
for (i in 1:5) {print(i)} 
[1] 1 
[1] 2 
[1] 3 
[1] 4 
[1] 5 

但是,執行代碼:

for (i in 1:5) {j <- i^2} 
j 
[1] 25 

只需使用一個全局變量來保存,如果你正在運行在一個循環中一些代碼的結果。

UPD:

this以下討論:

在一個循環中,自動打印是關閉的,因爲它是一個函數內。如果您想查看輸出結果,則需要在兩種情況下都明確地打印某些內容。

打印的缺失只是一種慣例,它會阻止您的控制檯偶爾被垃圾郵件。

+0

我必須承認我沒有在您的建議中獲得解決方案。你能用我提供的代碼舉個例子嗎? – sgunnars

+0

查看Arun上面的評論。你在循環中運行哪些代碼? – tonytonov

+0

我正在試圖完成我的例子試圖做的事情,獲得​​每個製造商擁有自己的子集的MPG子集。然後我繪製子集的列並導出每個製造商的圖。 – sgunnars

4

如果你想通過製造商循環,並運行一些總結代碼,試試這個:

#e.g. unique models per manufacturer 
dt[,unique(model),by="manufacturer"] 

#or with dplyr (same result) 

require(dplyr) 
dt %.% group_by(manufacturer) %.% summarise(unique(model)) 

    manufacturer   unique(model) 
1   audi      a4 
2   audi    a4 quattro 
3   audi    a6 quattro 
4  chevrolet  c1500 suburban 2wd 
5  chevrolet    corvette 
6  chevrolet  k1500 tahoe 4wd 
7  chevrolet     malibu 
8   dodge   caravan 2wd 
9   dodge  dakota pickup 4wd 
10  dodge   durango 4wd 
11  dodge ram 1500 pickup 4wd 
12   ford   expedition 2wd 
13   ford   explorer 4wd 
14   ford  f150 pickup 4wd 
15   ford    mustang 
16  honda     civic 
17  hyundai     sonata 
18  hyundai    tiburon 
19   jeep  grand cherokee 4wd 
20 land rover   range rover 
21  lincoln   navigator 2wd 
22  mercury  mountaineer 4wd 
23  nissan     altima 
24  nissan     maxima 
25  nissan   pathfinder 4wd 
26  pontiac    grand prix 
27  subaru   forester awd 
28  subaru   impreza awd 
29  toyota   4runner 4wd 
30  toyota     camry 
31  toyota   camry solara 
32  toyota    corolla 
33  toyota land cruiser wagon 4wd 
34  toyota  toyota tacoma 4wd 
35 volkswagen     gti 
36 volkswagen     jetta 
37 volkswagen    new beetle 
38 volkswagen     passat