Я пришел из 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
)
Добавьте вызов в [i] в вашем цикле так …
for(i in 1:length(sites.df$siteKey)) {
print(sites.df$siteCode[i])
}
Таким образом, каждая итерация будет печатать один экземпляр в местоположении [i].
Надеюсь, это имеет смысл.
Решение @dsifford хорошо в базе R. Тем не менее, я рекомендую взглянуть на dplyr
пакет в начале перехода с php, потому что это делает вещи намного более прозрачными, чем безнадежный беспорядок xapply
функции (извинения всем радикальным основателям).
library(dplyr)
site.df = data.frame(siteKey = paste0("site",1:4), siteCode = runif(4,9,28))
site.df %>%
rowwise %>%
do(print(.$siteCode))
Само по себе это не очень просто, но если у вас есть дополнительные манипуляции, это делает для более плавной езды.
Ваш вопрос в том виде, в котором он написан: «R loop: как правильно его использовать?»
Вы предлагаете этот код
for(i in 1:length(sites.df$siteKey)) {
print(sites.df$siteCode)
}
Этот код будет примером правильного использования цикла R (если вы настаивали на нем, даже если он не рекомендуется).
Этот код говорит, что для каждого прохода выведите «столбец» или полный список значений для $ siteCode. Цикл повторяет этот запрос на печать для каждого сайта, поэтому вы получаете один и тот же полный список для каждого прохода.
Как предложено выше @dsifford, изменив его на
for(i in 1:length(sites.df$siteKey)) {
print(sites.df$siteCode[i])
}
будет означать, что вместо печати всего списка будет напечатан только яго значение из этого списка для каждого прохода.
Новый код, который вы добавили, имеет различные проблемы, в частности, вы повторяете один и тот же код снова и снова для каждого сайта. Возможно, вы захотите написать функции для замены дубликата кода, а затем добавить функции в список сайтов, которые вы используете. Это тот случай, когда цикл может иметь смысл (хотя может и не иметь). Но это все побочные вопросы от вашего первоначального вопроса.