簡體   English   中英

如何使用 R (tidyverse) 中的函數迭代創建多個小標題?

[英]How can I iteratively create multiple tibbles using a function in R (tidyverse)?

我必須用相同的變量創建 10 個小標題(數據只是不同),這導致我復制以下代碼


dpd <- list_sheets[[1]] %>%
    filter(LASTUSER %in% users ) %>% 
    mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
           month = as.numeric(format(DATEMODIFI, format = "%m")),
           day = as.numeric(format(DATEMODIFI, format = "%d"))) %>% 
    select(-DATEMODIFI) %>% 
    filter(year == 2019),

  fuse <- list_sheets[[2]]%>%
    filter(LASTUSER %in% users ) %>% 
    mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
           month = as.numeric(format(DATEMODIFI, format = "%m")),
           day = as.numeric(format(DATEMODIFI, format = "%d"))) %>% 
    select(-DATEMODIFI) %>% 
    filter(year == 2019),

  ohprimary <- list_sheets[[3]]%>%
    filter(LASTUSER %in% users ) %>% 
    mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
           month = as.numeric(format(DATEMODIFI, format = "%m")),
           day = as.numeric(format(DATEMODIFI, format = "%d"))) %>% 
    select(-DATEMODIFI) %>% 
    filter(year == 2019),

  ohsecondary <- list_sheets[[4]]%>%
    filter(LASTUSER %in% users ) %>% 
    mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
           month = as.numeric(format(DATEMODIFI, format = "%m")),
           day = as.numeric(format(DATEMODIFI, format = "%d"))) %>% 
    select(-DATEMODIFI) %>% 
    filter(year == 2019),

  poles <- list_sheets[[5]]%>%
    filter(LASTUSER %in% users ) %>% 
    mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
           month = as.numeric(format(DATEMODIFI, format = "%m")),
           day = as.numeric(format(DATEMODIFI, format = "%d"))) %>% 
    select(-DATEMODIFI) %>% 
    filter(year == 2019),

  pv <- list_sheets[[6]]%>%
    filter(LASTUSER %in% users ) %>% 
    mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
           month = as.numeric(format(DATEMODIFI, format = "%m")),
           day = as.numeric(format(DATEMODIFI, format = "%d"))) %>% 
    select(-DATEMODIFI) %>% 
    filter(year == 2019),

  switch <- list_sheets[[7]]%>%
    filter(LASTUSER %in% users ) %>% 
    mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
           month = as.numeric(format(DATEMODIFI, format = "%m")),
           day = as.numeric(format(DATEMODIFI, format = "%d")))%>% 
    select(-DATEMODIFI) %>% 
    filter(year == 2019),

  transformers <- list_sheets[[8]]%>%
    filter(LASTUSER %in% users ) %>% 
    mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
           month = as.numeric(format(DATEMODIFI, format = "%m")),
           day = as.numeric(format(DATEMODIFI, format = "%d")))%>% 
    select(-DATEMODIFI) %>% 
    filter(year == 2019),

  ugprimary <- list_sheets[[9]]%>%
    filter(LASTUSER %in% users ) %>% 
    mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
           month = as.numeric(format(DATEMODIFI, format = "%m")),
           day = as.numeric(format(DATEMODIFI, format = "%d")))%>% 
    select(-DATEMODIFI) %>% 
    filter(year == 2019),

  ugsecondary <- list_sheets[[10]]%>%
    filter(LASTUSER %in% users ) %>% 
    mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
           month = as.numeric(format(DATEMODIFI, format = "%m")),
           day = as.numeric(format(DATEMODIFI, format = "%d")))%>% 
    select(-DATEMODIFI) %>% 
    filter(year == 2019)

所以我創建了以下函數,並嘗試像這樣迭代地創建它們:

createTibble <- function(i){
  list_sheets[[i]]%>%
    filter(LASTUSER %in% users ) %>% 
    mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
           month = as.numeric(format(DATEMODIFI, format = "%m")),
           day = as.numeric(format(DATEMODIFI, format = "%d")))%>% 
    select(-DATEMODIFI) %>% 
    filter(year == 2019)


}

features <- c('dpd', 'fuse')

for (feature in seq_along(features)){
  tibble <- sym(features[feature]) # returns the proper symbol e.g. 'dpd' -> dpd 
  tibble <- createTibble(feature) # This just gives me a table called tibble

}

這不會給我兩個 tibble(dpd 和保險絲),而是我只會得到一個名為 tibble 的 tibble

我究竟做錯了什么? 我喜歡 R 但為什么做這樣的事情一定很煩人

編輯:

features <- c('dpd', 'fuse')
output <- vector('list', length(features))
for (feature in seq_along(features)){

  output[[feature]] <- createTibble(feature)
  name <- sym(features[feature])
  print(name)
  name <- output[[feature]]

}

為了創建一個對象list ,用一個空list初始化並根據for循環每次迭代中函數的輸出為其賦值

features <- c('dpd', 'fuse')
output <- setNames(vector('list', length(features)), features)
for (feature in seq_along(features)){

   output[[feature]] <- createTibble(feature)
}

不建議在全局環境中有多個對象,但如果需要,則assign一個選項

for (feature in seq_along(features)){
    assign(features[feature], value = createTibble(feature))
 }

現在,我們檢查

ls()

對於創建的對象


或者使用tidyverse

library(purrr)
map(seq_along(features), ~createTibble(.x)) %>%
   set_names(features) %>%
   list2env(.GlobalEnv)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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