【问题标题】:Fastest way to paste all rows together将所有行粘贴在一起的最快方法
【发布时间】:2021-03-18 06:21:26
【问题描述】:

我想将所有行逐列粘贴到同一个单元格中

例如,我有一个如下表:

library(tibble)

tibble::tribble(
  ~Col1, ~Col2, ~Col3,
  "AA",     "AA",    "AB",
  "AB",     "AB",    "BB",
  "BC",     "BB",    "AA"
  )
Col1  Col2  Col3

AA     AA    AB

AB     AB    BB
 
BC     BB    AA

我想要的输出是一个3X1的表格,如下:

Col1 AAABBC

Col2 AAABBB

Col3 ABBBAA 

但是,实际情况更复杂,因为我的原始表有 600,000 行和 2000 列。我想知道实现这一目标的最快方法是什么。我尝试了循环,但它需要很长时间才能完成逐列粘贴。

感谢任何帮助,谢谢!

【问题讨论】:

    标签: r data-wrangling


    【解决方案1】:

    如果您有足够的内存来存储数据的多个实例,那么这种使用 doParallel 包的方法可能会奏效。这里我使用的是tidyversefamily。

    
    library(tidyverse)
    library(doParallel)
    
    n <- 1000
    # Generate a 1000 rows df with ~3000 columns
    big_table <- do.call("rbind", replicate(n, data, simplify = FALSE))
    lapply(1:10, function(x) {big_table <<- bind_cols(big_table, big_table); return(x)})
    
    # Get the list of column names
    col_list <- names(big_table)
    # Define number of cores you want to process
    number_of_parallel_cores <- 4
    col_group <- split(col_list, sort(rep_len(1:number_of_parallel_cores, length(col_list))))
    
    # Running the code with timer
    system.time({
      registerDoParallel(number_of_parallel_cores)
      combine_data <- bind_rows(foreach(i_col_group = col_group) %dopar% {
        big_table %>%
          select(one_of(i_col_group)) %>%
          summarize(across(.fns = paste, collapse = "")) %>%
          pivot_longer(cols = everything(), names_to = "col_names", values_to = "values")
      })
    })
    

    时间

       user  system elapsed 
      1.291   0.291   0.898 
    

    输出

       col_names values                                                                                                                                                                                                               
       <chr>     <chr>                                                                                                                                                                                                                
     1 Col1...1  AAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAA…
     2 Col2...2  AAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAA…
     3 Col3...3  ABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAAB…
     4 Col1...4  AAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAA…
     5 Col2...5  AAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAA…
     6 Col3...6  ABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAAB…
     7 Col1...7  AAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAA…
     8 Col2...8  AAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAA…
     9 Col3...9  ABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAABBBAAAB…
    10 Col1...10 AAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAAABBCAA…
    # … with 3,062 more rows
    

    但是我发现与并行设置相比,简单地绑定在一起要快得多。猜猜这个操作的间接成本是不可行的

    system.time(
      big_table %>%
        select(one_of(col_list)) %>%
        summarize(across(.fns = paste, collapse = "")) %>%
        pivot_longer(cols = everything(), names_to = "col_names", values_to = "values")
    )
    
       user  system elapsed 
      0.021   0.000   0.022 
    

    【讨论】:

    • 天啊,你太棒了。这真的很有帮助!!!非常感谢!!!
    【解决方案2】:
    library(data.table)
    
    dt <- fread('Col1  Col2  Col3
    AA     AA    AB
    AB     AB    BB
    BC     BB    AA')
    
    
    transpose(dt)[,.(result=do.call(paste0,.SD))]
    #>    result
    #> 1: AAABBC
    #> 2: AAABBB
    #> 3: ABBBAA
    
    #or
    
    
    dt <- fread('Col1  Col2  Col3
    AA     AA    AB
    AB     AB    BB
    BC     BB    AA')
    transpose(dt[,paste0("new_cols",1:3) := lapply(.SD,paste,collapse="")][1,.SD,.SDcols = patterns("^new")])
    #>        V1
    #> 1: AAABBC
    #> 2: AAABBB
    #> 3: ABBBAA
    

    reprex package (v0.3.0) 于 2021-03-18 创建

    第二种方法应该比第一种更快。

    【讨论】:

      【解决方案3】:
      lapply(df, paste, collapse="")
      

      这会返回一个列表。如果您需要矢量,请使用sapply 而不是lapply。如果您想要一个数据框,请将整个调用包装在 data.frame 中。

      【讨论】:

        【解决方案4】:

        我们可以使用collapse 中的dapply,它针对行操作进行了优化

        library(collapse)
        dapply(df1, paste, collapse="", MARGIN = 1)
        #[1] "AAAAAB" "ABABBB" "BCBBAA"
        

        根据?dapply

        dapply 有效地将函数应用于矩阵对象的列或行,并默认返回具有相同类型和相同属性的对象。或者,可以在普通矩阵或 data.frame 中返回结果。也可以使用简单的并行性。

        【讨论】:

          猜你喜欢
          • 2017-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-12
          • 2010-11-17
          • 1970-01-01
          • 2017-01-01
          相关资源
          最近更新 更多