簡體   English   中英

我可以使用tidyverse更快地使用'if'和'else'語句進行for循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM