【问题标题】:Split multiple columns based on the same delimiter [duplicate]根据相同的分隔符拆分多列[重复]
【发布时间】:2020-10-28 11:07:16
【问题描述】:

我很难找到一种更加程序化的方法来根据相同的分隔符拆分多列...

该解决方案适用于 n 列,所有列都由类似的模式标识,在我的示例中为“^var[0-9]”

例如

library(tidyverse)
foo <- data.frame(var1 = paste0("a_",1:10), var2 = paste("a_",1:10), id = 1:10)

# Desired output

foo %>% 
  separate(var1, into = c("group1", "index1")) %>%
  separate(var2, into = c("group2", "index2"))
#>    group1 index1 group2 index2 id
#> 1       a      1      a      1  1
#> 2       a      2      a      2  2
#> 3       a      3      a      3  3
#> 4       a      4      a      4  4
#> 5       a      5      a      5  5
#> 6       a      6      a      6  6
#> 7       a      7      a      7  7
#> 8       a      8      a      8  8
#> 9       a      9      a      9  9
#> 10      a     10      a     10 10

【问题讨论】:

    标签: r


    【解决方案1】:

    这不是很优雅,但它有效(基于此处的答案:Tidy method to split multiple columns using tidyr::separate):

    grep("var[0-9]", names(foo), value = TRUE) %>% 
      map_dfc(~ foo %>% 
                select(.x) %>% 
                separate(.x, 
                         into = paste0(c("group", "index"), gsub("[^0-9]", "", .x)))
      ) %>% 
      bind_cols(id = foo$id)
    

    返回:

    组 1 索引 1 组 2 索引 2 id 1 一 1 一 1 1 2 一个 2 一个 2 2 3 一 3 一 3 3 4 一 4 一 4 4 5 一个 5 一个 5 5 6 一 6 一 6 6 7 一 7 一 7 7 8 一 8 一 8 8 9 一 9 一 9 9 10 一个 10 一个 10 10

    【讨论】:

    • 谢谢!也用于寻找骗子:) 已标记并关闭
    • 上一个答案几乎是但不完全是一个骗局:它不必考虑通过正则表达式匹配列,这已在上面的答案中实现。
    • 将问题标记为骗子并不一定意味着它们完全相同 - 但它们将以非常明显的方式链接起来,这使得查找相关问题变得更加容易。因此我将其标记为骗子:)
    • 也适用于未来的读者 - 与发帖人所说的相反,我个人认为这是解决所发布问题的相当优雅的解决方案。但是,我在提出问题后立即注意到,对于我的后续分析,将列重新整形为长格式会是一种更好的方法。因此,如果您有类似的问题 - 需要考虑一下!
    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 2013-02-27
    • 2018-10-25
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多