【问题标题】:Loop through two data frames and concatenate contents to string循环遍历两个数据帧并将内容连接到字符串
【发布时间】:2018-02-22 22:49:31
【问题描述】:

我正在尝试通过将各个部分连接在一起来创建大量文件 URL。 (比如说,大约 40 个文件 URL,它们代表 50 个州中的每一个州的多种数据类型。)最终,我将下载并解压缩/解压缩这些文件。 (我有这部分的工作代码。)

我是一个 R 菜鸟,所以请耐心等待。

我有一组数据框:

  • states - 50 个州的缩写列表
  • partial_url - 50 个州的部分 URL
  • url_parts - 每个剩余 URL 的列表 件(5 种文件类型可供下载)
  • 文件类型

    我需要一个如下所示的 URL: http://partial_url/state_urlpart_2017_file.csv.gz

    我能够使用以下内容构建 partial_url 数据框:

    for (i in seq_along(states)) {
      url_part1 <- as.data.frame(paste0(url,states[[i]],"/",dir,"/"))
    
    }
    

    我希望某种嵌套循环可以完成剩下的工作,就像这样:

    for (i in 1:partial_url){
      for (j in 1:url_parts){
        for(k in 1:states){
          url_part2 <- as.data.frame(paste0(partial_url[[i]],"/",url_parts[[j]],states[[k]],year,filetype))
        }}} 
    

    谁能建议如何进行最后一步?

  • 【问题讨论】:

    • 提供示例数据有助于我们了解您实际使用的内容。例如,您说您有 5 个数据框,但随后将其中一些描述为列表 - 这些是在 R 中具有特定含义的词。
    • 所有数据框的行数是否相同?您for-loop 建议这些数据帧具有相同的行数,并且那些与row number 匹配的记录相同。

    标签: r for-loop nested-loops string-concatenation


    【解决方案1】:

    据我了解,所有 OP 需求都可以由 paste0 函数本身处理。 paste0 用作矢量化格式。因此,不需要 OP 显示的for-loop。我的示例中使用的数据以vector 格式存储,但可以用data.frame 列表示。

    例如:

    states <- c("Alabama", "Colorado", "Georgia")
    partial_url <- c("URL_1", "URL_2", "URL_3")
    url_parts <- c("PART_1", "PART_2", "PART_3")
    year <- 2017
    fileType <- "xls"
    
    #Now use paste0 will list out all the URLS
    paste0(partial_url,"/",url_parts,states,year,fileType)
    
    #[1] "URL_1/PART_1Alabama2017xls"  "URL_2/PART_2Colorado2017xls"
    #[3] "URL_3/PART_3Georgia2017xls" 
    

    编辑:基于@Onyambu 反馈的多个文件类型 我们可以使用rep(fileType, each = length(states)) 来支持多个文件。 解决方案将如下所示。

    fileType <- c("xls", "doc")
    
    paste0(partial_url,"/",url_parts,states,year,rep(fileType,each = length(states)))
    [1] "URL_1/PART_1Alabama2017xls"  "URL_2/PART_2Colorado2017xls" "URL_3/PART_3Georgia2017xls" 
    [4] "URL_1/PART_1Alabama2017doc"  "URL_2/PART_2Colorado2017doc" "URL_3/PART_3Georgia2017doc" 
    

    【讨论】:

    • 这并不能解决所提出的问题。再次查看 for 循环。您的示例中应该有 27 个网址
    • @Onyambu 感谢您的指出。我们可以使用repeach 来生成多种类型的URL。我已经更新了我的答案。
    • 是 27 岁吗?他们似乎是 9.. 你应该有 27 个文件。是的,你是对的,你可以使用 rec 或 external 等
    • @Onyambu 谢谢。只有6个文件。我认为OP需要澄清一些事情。 IMO,statespartial_url 具有 1-1 关系。 url_parts 可以是多个,它们与 states 或 1-1 关系中的每一个关联。 OP需要指定。我的回答提供了足够的细节,表明可以满足 OP 需求。收到 OP 的消息后,我可以修改我的答案。
    • 我明白你的意思。对不起。我认为forloop是正确的。但也许它#不是
    【解决方案2】:

    这是一个tidyverse 解决方案,其中包含一些简单的示例数据。方法是使用complete 给自己一个数据框,其中包含所有可能的变量组合。这是因为如果您将每个变量都设为因子,complete 将包括所有可能的因子水平,即使它们没有出现。这使得组合您的五个 url 部分变得容易,即使它们看起来有不同的nrow(例如,50 个状态,但只有 5 个文件类型)。 unite 允许您将列作为字符串连接在一起,因此我们调用它三次以包含正确的分隔符,然后最后添加 http://mutate

    Re:你的for 循环,我发现首先很难通过嵌套的for 循环逻辑。但至少有两个书面问题包括你有1:partial_url 而不是1:length(partial_url) 和类似的,并且你只是在循环的每一次传递中覆盖同一个对象。我更喜欢避免循环,除非这是绝对必要的问题。

    library(tidyverse)
    states <- tibble(state = c("AK", "AZ", "AR", "CA", "NY"))
    partial_url <- tibble(part = c("part1", "part2"))
    url_parts <- tibble(urlpart = c("urlpart1", "urlpart2"))
    year <- tibble(year = 2007:2010)
    filetype <- tibble(filetype = c("csv", "txt", "tar"))
    
    urls <- bind_cols(
      states = states[[1]] %>% factor() %>% head(2),
      partial_url = partial_url[[1]] %>% factor() %>% head(2),
      url_parts = url_parts[[1]] %>% factor() %>% head(2),
      year = year[[1]] %>% factor() %>% head(2),
      filetype = filetype[[1]] %>% factor() %>% head(2)
      ) %>%
      complete(states, partial_url, url_parts, year, filetype) %>%
      unite("middle", states, url_parts, year, sep = "_") %>%
      unite("end", middle, filetype, sep = ".") %>%
      unite("url", partial_url, end, sep = "/") %>%
      mutate(url = str_c("http://", url))
    print(urls)
    # A tibble: 160 x 1
       url                              
       <chr>                            
     1 http://part1/AK_urlpart1_2007.csv
     2 http://part1/AK_urlpart1_2007.txt
     3 http://part1/AK_urlpart1_2008.csv
     4 http://part1/AK_urlpart1_2008.txt
     5 http://part1/AK_urlpart1_2009.csv
     6 http://part1/AK_urlpart1_2009.txt
     7 http://part1/AK_urlpart1_2010.csv
     8 http://part1/AK_urlpart1_2010.txt
     9 http://part1/AK_urlpart2_2007.csv
    10 http://part1/AK_urlpart2_2007.txt
    # ... with 150 more rows
    

    reprex package (v0.2.0) 于 2018 年 2 月 22 日创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 2018-11-13
      相关资源
      最近更新 更多