[英]Can I use tidyverse to make a for loop with an 'if' and 'else' statement faster
我有一個for循環,使用if else語句進行數據挖掘。 但是,這需要很長時間才能運行。 我在某處讀到tidyverse(dplyr或purrr)有時可以代替運行循環,是一種更快的替代方法,但是在purrr中找不到任何'if''else'函數。 到目前為止,這是我的循環:
for (j in 1:length(my.query$data$value)){
if(my.query$data$station[j] %in% dataPRCP[,1]){
rowNum<-which(dataPRCP[,1]==my.query$data$station[j])
dataPRCP[rowNum,i+3]<-my.query$data$value[j]
} else {
dataPRCP<-rbind(dataPRCP,emptyrow)
rowNum<-length(dataPRCP[,1])
location <- ncdc_stations(stationid = my.query$data$station[j])
dataPRCP[rowNum,1]<-my.query$data$station[j]
dataPRCP[rowNum,2]<-location$data$latitude
dataPRCP[rowNum,3]<-location$data$longitude
dataPRCP[rowNum,i+3]<-my.query$data$value[j]
}
}
您需要一個簡單的示例來獲得直接幫助(我不知道您的數據是什么樣,也不知道您如何嘗試操作它)。 但是, purrr
的一般策略是將函數應用於列表中的每個元素。 將if / else語句放入函數中(帶有適當的輸入),然后map
將函數應用於每個元素:
# trivial example
library(purrr)
result <- map(1:5, print)
或(如果/否則)
f <- function(x) {
if(x > 2) data_frame(a = 4, b = 10)
else data_frame(a = 0, b = 3)
}
map_df(1:5, f) # result is a data_frame
如果輸出是數據框中的新元素,則可能會發現ifelse
向量化的tidyverse
或對數據類型更挑剔的tidyverse
版本if_else
會更有用。
# trivial example
# library(dplyr)
data_frame(a = 1:4) %>%
mutate(b = if_else(a > 2, 1, 10)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.