【发布时间】:2015-05-23 14:08:13
【问题描述】:
我来自 PHP 背景,但仍在尝试了解 R。
例如,我可以轻松地在 PHP 中循环一个数组并操作数据,
$array = [
"site1" => 9
"site2" => 10
"site3" => 18
"site4" => 28
]
foreach($array as $index => $id) {
echo $id . '<br/>';
}
结果,
9
10
18
28
但在 R 中,例如,我有这个数据框,
siteKey siteCode
1 site1 9
2 site2 10
3 site3 18
4 site4 28
循环,
for(i in 1:length(sites.df$siteKey)) {
print(sites.df$siteCode)
}
结果,
[1] "9" "10" "18" "28"
[1] "9" "10" "18" "28"
[1] "9" "10" "18" "28"
[1] "9" "10" "18" "28"
我以为应该是下面这个结果?
"9"
"10"
"18"
"28"
知道如何使用 R 循环来获得所需的结果吗?
编辑:
查询,
# Prepare SQL query1.
dataQuery <- "SELECT
*
FROM speckdata AS s
LEFT JOIN weatherunderground AS w
ON s.wid_timestamp = w.wid_timestamp
LEFT JOIN nodes AS n
ON n.nid = s.nid
AND n.datatype = 'speck'
WHERE n.nid = 'SITE'
"
也许在下面循环这个更好?
#
# Data: site 1
#
# Match the pattern and replace it.
data1Query <- sub("SITE", as.character(site1), data1Query)
# Store the result in data1.
data1 = dbGetQuery(DB, data1Query)
#
# Data: site 2
#
data2Query <- sub("SITE", as.character(site2), data2Query)
# Store the result in data.
data2 = dbGetQuery(DB, data2Query)
#
# Data: site 3
#
data3Query <- sub("SITE", as.character(site3), data3Query)
# Store the result in data.
data3 = dbGetQuery(DB, data3Query)
#
# Data: site 4
#
data4Query <- sub("SITE", as.character(site4), data4Query)
# Store the result in data.
data4 = dbGetQuery(DB, data4Query)
然后合并所有数据,
# Merge data sets.
set.seed(1)
dataList = list(data1, data2, data3, data4)
allData = Reduce(function(...) merge(..., all=T), dataList)
然后绘制数据,
timePlot(
allData,
pollutant = c(species, condition),
avg.time = mean,
lwd = 2,
lty = 1,
type = "site",
group = TRUE,
auto.text = FALSE
)
【问题讨论】:
-
不需要循环的解决方案。
writeLines(as.character(sites.df$siteCode)) -
我同意其他 cmets。如果您的目标是打印
siteCode列中的值,那么绝对没有理由使用循环。事实上,您已经使用了适当的代码,即print(sites.df$siteCode)。为什么您觉得需要将其包装在一个循环中尚不清楚。如果目标不是打印,您需要在问题中指定它。但是,很有可能您仍然不需要循环。阅读The R Inferno。 -
为您更广泛的问题创建一个可重复的示例。不仅仅是代码的sn-ps。例如
dataQuery的值?提供一些数字我们可以尝试的方法。 -
lapply就是为此而设计的。像lapply(sites.df$siteKey, function(x) { data1Query <- sub("DATE1", as.character(date_from), dataQuery); data1Query <- sub("DATE2", as.character(date_to), data1Query); sub("SITE", as.character(x), data1Query) })这样的东西。 (未测试,因为没有可重现的示例。) -
sub的用法可能会被赋值替换。data1Query <- sub("DATE1", as.character(date_from), dataQuery)可以变成data1Query$DATE1 <- as.character(dataQuery$data_from)。但同样,没有具体的例子,这只是猜测。