我正在尝试遍历一个列表,该列表用于对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()
}
我什么都没得到。
对我来说,代码部分看起来完全相同,应该同样有效。有没有人有一个建议可能导致我没有得到第二次过滤的任何东西?任何帮助表示赞赏。
答案 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