【问题标题】:How can I iteratively create multiple tibbles using a function in R (tidyverse)?如何使用 R (tidyverse) 中的函数迭代地创建多个小标题?
【发布时间】:2019-12-17 01:39:12
【问题描述】:

我必须创建 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 和 fuse)而是我只会得到一个名为 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]]

}

【问题讨论】:

  • 您需要创建一个列表来存储输出,即out &lt;- vector('list', length(features)),在for循环内,out[[feature]] &lt;- createTibble(feature)tibble是一个函数名,请使用不同的名称作为对象名
  • 我没有看到任何编辑,same exact result 是什么意思(是来自for 循环的那个吗?)请展示一个可重复的小示例
  • 如果你已经分配了output[[feature]] &lt;- createTibble(feature)并且你的createTibble有效,那么它应该返回output中的两个元素,因为你已经创建了output &lt;- vector('list', length(features)),检查output如果你正在检查@987654335 @,事实并非如此。此外,您可能需要在for 循环之后将“输出”的名称指定为names(output) &lt;- features,即不需要name &lt;- sym(features[feature])
  • 我不建议在全局环境中创建多个对象
  • 我发布了一个包含您想要的要求的解决方案

标签: r tidyverse


【解决方案1】:

为了创建对象的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)

【讨论】:

    猜你喜欢
    • 2021-05-30
    • 2021-09-21
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2021-05-27
    • 2020-10-30
    • 1970-01-01
    • 2018-05-20
    相关资源
    最近更新 更多