R:使用for循环和过滤data.table

时间:2014-01-20 12:32:30

标签: r for-loop data.table

我正在尝试遍历一个列表,该列表用于对data.table进行子集化,并通过几行代码运行结果。使用变量进行子设置是完美的,没有for循环,但是当包含循环时,它不能按预期工作。我想问题是由数据类型或范围引起的。

以下代码完美无缺:

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()
}

我什么都没得到。

对我来说,代码部分看起来完全相同,应该同样有效。有没有人有一个建议可能导致我没有得到第二次过滤的任何东西?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分: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讨论之后:

在循环中,自动打印关闭,因为它在函数内部。如果要查看输出,则需要在两种情况下都明确打印。

缺少打印只是一种惯例,这会阻止您的控制台偶尔被垃圾邮件发送。

答案 1 :(得分: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