【问题标题】:Selecting all but the first element of a vector in data frame选择数据框中向量的第一个元素以外的所有元素
【发布时间】:2022-01-25 13:42:05
【问题描述】:

我有一些看起来像这样的数据:

X1
A,B,C,D,E
A,B
A,B,C,D
A,B,C,D,E,F

我想生成一个包含每个向量的第一个元素(“A”)的列,以及另一个包含所有其余值的列(“B”、“C”等):

X1              Col1    Col2
A,B,C,D,E       A       B,C,D,E
A,B             A       B
A,B,C,D         A       B,C,D
A,B,C,D,E,F     A       B,C,D,E,F

我尝试了以下方法:

library(dplyr)

testdata <- data.frame(X1 = c("A,B,C,D,E",
                              "A,B",
                              "A,B,C,D",
                              "A,B,C,D,E,F")) %>%
  mutate(Col1 = sapply(strsplit(X1, ","), "[", 1),
         Col2 = sapply(strsplit(X1, ","), "[", -1))

但是,我似乎无法摆脱 Col2 中值周围的讨厌的向量括号。有什么办法吗?

【问题讨论】:

  • 你的意思是你打算让Col2 成为一个字符串而不是一个列表列?
  • 或许Col2 = sapply(strsplit(X1, ","), function(z) paste(z[-1], collapse=","))?

标签: r dataframe split subset


【解决方案1】:

您可以将tidyr::separateextra = "merge" 一起使用:

testdata %>% 
  tidyr::separate(X1, into = c("Col1","Col2"), sep = ",", extra = "merge", remove = F)

           X1 Col1      Col2
1   A,B,C,D,E    A   B,C,D,E
2         A,B    A         B
3     A,B,C,D    A     B,C,D
4 A,B,C,D,E,F    A B,C,D,E,F

【讨论】:

    【解决方案2】:

    一个可能的解决方案,使用tidyr::separate

    library(tidyverse)
    
    df <- data.frame(
      stringsAsFactors = FALSE,
      X1 = c("A,B,C,D,E", "A,B", "A,B,C,D", "A,B,C,D,E,F")
    )
    
    df %>% 
      separate(X1, into = str_c("col", 1:2), sep = "(?<=^.),", remove = F)
    
    #>            X1 col1      col2
    #> 1   A,B,C,D,E    A   B,C,D,E
    #> 2         A,B    A         B
    #> 3     A,B,C,D    A     B,C,D
    #> 4 A,B,C,D,E,F    A B,C,D,E,F
    

    【讨论】:

      【解决方案3】:

      使用sub + read.table尝试下面的基本 R 代码

      cbind(
        df,
        read.table(
          text = sub(",", " ", df$X1)
        )
      )
      

      给了

                 X1 V1        V2
      1   A,B,C,D,E  A   B,C,D,E
      2         A,B  A         B
      3     A,B,C,D  A     B,C,D
      4 A,B,C,D,E,F  A B,C,D,E,F
      

      【讨论】:

        【解决方案4】:

        您可以使用str_sub()函数如下:

        > df
        # A tibble: 4 x 1
          X1         
          <chr>      
        1 A,B,C,D,E  
        2 A,B        
        3 A,B,C,D    
        4 A,B,C,D,E,F
        
        > df %>% mutate(X2 = str_sub(X1, 1,1), X3 = str_sub(X1, 3))
        # A tibble: 4 x 3
          X1          X2    X3       
          <chr>       <chr> <chr>    
        1 A,B,C,D,E   A     B,C,D,E  
        2 A,B         A     B        
        3 A,B,C,D     A     B,C,D    
        4 A,B,C,D,E,F A     B,C,D,E,F
        

        【讨论】:

        • 这并不理想,因为第一个元素很容易成为AA
        • 我认为问题在于提取第一个元素,而不是A 字符! @IanCampbell。但是如果它想要提取一个字符串,那么你是对的,这段代码没有用。
        • str_sub("AA,B",1,1) 的输出是什么?
        • 你是对的。 @IanCampbell
        猜你喜欢
        • 1970-01-01
        • 2013-11-04
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 2019-05-10
        • 1970-01-01
        • 2012-05-14
        • 2013-09-23
        相关资源
        最近更新 更多