R петля — как правильно ее использовать?

Я пришел из 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
)

-2

Решение

Добавьте вызов в [i] в ​​вашем цикле так …

for(i in 1:length(sites.df$siteKey)) {
print(sites.df$siteCode[i])
}

Таким образом, каждая итерация будет печатать один экземпляр в местоположении [i].

Надеюсь, это имеет смысл.

2

Другие решения

Решение @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))

Само по себе это не очень просто, но если у вас есть дополнительные манипуляции, это делает для более плавной езды.

1

Ваш вопрос в том виде, в котором он написан: «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])
}

будет означать, что вместо печати всего списка будет напечатан только яго значение из этого списка для каждого прохода.

Новый код, который вы добавили, имеет различные проблемы, в частности, вы повторяете один и тот же код снова и снова для каждого сайта. Возможно, вы захотите написать функции для замены дубликата кода, а затем добавить функции в список сайтов, которые вы используете. Это тот случай, когда цикл может иметь смысл (хотя может и не иметь). Но это все побочные вопросы от вашего первоначального вопроса.

1
По вопросам рекламы [email protected]