首页 > 解决方案 > 按列名中的模式组合列

问题描述

我有一个非常宽的数据框,其中每列存在三次,后缀不同:xxx_A1.5, xxx_A2.0, xxx_A2.5. 考虑这个例子:

df1 <- data.frame(col1_A1.5 = c(1,2,3,4), 
                  col1_A2.0 = c(2,3,4,5),
                  col1_A2.5 = c(3,4,5,6),
                  col2_A1.5 = c(10,20,30,40), 
                  col2_A2.0 = c(20,30,40,50),
                  col2_A2.5 = c(30,40,50,60))

我现在想根据这种模式将所有内容组合col1_xxx成一列(名为; col2 等相同): . 因此,示例中的预期结果是:col1col1_A2.0 [colA1.5, colA2.5]

       col1           col2
1  "2 [1, 3]"    "20 [10, 30]"
2  "3 [2, 4]"    "30 [20, 40]"
3  "4 [3, 5]"    "40 [30, 50]"
4  "5 [4, 6]"    "50 [40, 60]"

由于我有 > 100 列,我需要一个基于模式的解决方案;我尝试了几种组合,mutateacross无法达到预期的结果。有人可以提供提示或解决方案吗?提前致谢。

标签: rdplyrtidyverse

解决方案


您可以使用split.default基于列名中的模式拆分数据框,并用于imap从每个列表的多列中创建一列。

purrr::imap_dfc(split.default(df1, sub('_.*', '', names(df1))), function(x, y) 
    tibble::tibble(!!y := sprintf('%d [%d, %d]', 
                   x[[paste0(y, '_A2.0')]], x[[paste0(y, '_A1.5')]], 
                   x[[paste0(y, '_A2.5')]])))
          
#   col1     col2       
#  <chr>    <chr>      
#1 2 [1, 3] 20 [10, 30]
#2 3 [2, 4] 30 [20, 40]
#3 4 [3, 5] 40 [30, 50]
#4 5 [4, 6] 50 [40, 60]  

推荐阅读