【问题标题】:split columns by character in list of data frames按字符在数据帧列表中拆分列
【发布时间】:2020-01-18 02:22:16
【问题描述】:

我有以下数据框列表:

df1 <- data.frame(x = 1:3, y=c("1,2","1,2,3","1,5"))
df2 <- data.frame(x = 4:6, y=c("1,2","1,4","1,6,7,8"))
filelist <- list(df1,df2)

> filelist
[[1]]
     x     y
   1 1   1,2
   2 2 1,2,3
   3 3   1,5

[[2]]
    x       y
  1 4     1,2
  2 5     1,4
  3 6 1,6,7,8

现在我想按字符 ',' 拆分每列 'y' 并将输出存储在数据框中的新列中。

输出应如下所示:

> filelist
[[1]]
   x     y_ref   y_alt1    y_alt2
1  1         1        2
2  2         1        2         3
3  3         1        5

[[2]]
   x     y_ref   y_alt2    y_alt3     y_alt4
 1 4         1        2
 2 5         1        4
 3 6         1        6         7          8

我该怎么做?我知道有 'strsplit' 可以按字符拆分字符串。但我不知道如何将输出存储在不同的列中。

【问题讨论】:

    标签: r


    【解决方案1】:

    filelist 中每个数据框的"y" 列上应用cSplit

    lapply(filelist, splitstackshape::cSplit, "y")
    
    #[[1]]
    #   x y_1 y_2 y_3
    #1: 1   1   2  NA
    #2: 2   1   2   3
    #3: 3   1   5  NA
    
    #[[2]]
    #   x y_1 y_2 y_3 y_4
    #1: 4   1   2  NA  NA
    #2: 5   1   4  NA  NA
    #3: 6   1   6   7   8
    

    【讨论】:

      【解决方案2】:

      这是一个依赖于来自tstrsplit 的解决方案

      library(data.table)
      lapply(filelist,
             function(DF) {
               commas = max(nchar(as.character(DF$y)) -nchar( gsub(",", "", DF$y)))
               DF[, c('y_ind', paste0('y_alt', seq_len(commas)))] = tstrsplit(as.character(DF$y), ',')
               DF
             })
      #> [[1]]
      #>   x     y y_ind y_alt1 y_alt2
      #> 1 1   1,2     1      2   <NA>
      #> 2 2 1,2,3     1      2      3
      #> 3 3   1,5     1      5   <NA>
      #> 
      #> [[2]]
      #>   x       y y_ind y_alt1 y_alt2 y_alt3
      #> 1 4     1,2     1      2   <NA>   <NA>
      #> 2 5     1,4     1      4   <NA>   <NA>
      #> 3 6 1,6,7,8     1      6      7      8
      

      reprex package (v0.3.0) 于 2019 年 9 月 17 日创建

      【讨论】:

        【解决方案3】:

        还可以使用dplyr,像这样使用separate()

        df %>%
        separate(y, into = c(y_ind,y_alt1,...), sep = ",")
        

        请注意,也可以更“以编程方式”使用 into 来生成所需数量的具有适当索引的结果列,而无需手动定义每个结果列。

        【讨论】:

          猜你喜欢
          • 2018-01-22
          • 1970-01-01
          • 2020-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-11
          相关资源
          最近更新 更多