选择数据框中除第一个元素以外的所有元素

Selecting all but the first element of a vector in data frame

我有一些数据如下所示:

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 中值周围讨厌的向量括号。有什么办法吗?

一个可能的解决方案,使用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

您可以将 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

使用 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

您可以使用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