R 中的字符串拆分和重复行?

Min*_*̀nh 2 split r duplicates rbind

我有一个数据库如下:

col1 <-c("X1",";X2","X3;X4;X5","X6;X7")
[1] "X1"       ";X2"      "X3;X4;X5" "X6;X7" 
col2 = col3 = col4 <- c("5","8","4","1")
[1] "5" "8" "1" "4"
dat <- data.frame(col1,col2,col3,col4)
 dat
      col1 col2 col3 col4
1       X1    5    5    5
2      ;X2    8    8    8
3 X3;X4;X5    4    4    4
4    X6;X7    1    1    1
Run Code Online (Sandbox Code Playgroud)

我想删除第 1 列中的分号,如果第 1 列包含超过一个 X,它将重复新行。此外,第 2 列和第 3 列将重复值,第 4 列将替换为值 0。我预计它将是:

dat
  col1 col2 col3 col4
1   X1    5    5    5
2   X2    8    8    8
3   X3    4    4    4
4   X4    4    4    0
5   X5    4    4    0
6   X6    1    1    1
7   X7    1    1    0
Run Code Online (Sandbox Code Playgroud)

G. *_*eck 6

col1按分号分割,并根据需要使用 tidyrunnest将单行分解为多行。接下来,它用于filter删除由前导(或尾随或多个)分号生成的不需要的行。tidyr 放在col1最后,所以我们使用 重新排列select。或者,如果列顺序无关紧要,只需省略select.

library(dplyr)
library(tidyr)

   dat %>%
       mutate(col1 = strsplit(as.character(col1), ";")) %>%
       unnest(col1) %>%
       filter(col1 != "") %>%
       select(col1, col2:col4)
Run Code Online (Sandbox Code Playgroud)

给予:

Source: local data frame [7 x 4]

       col1   col2   col3   col4
      (chr) (fctr) (fctr) (fctr)
    1    X1      5      5      5
    2    X2      8      8      8
    3    X3      4      4      4
    4    X4      4      4      4
    5    X5      4      4      4
    6    X6      1      1      1
    7    X7      1      1      1
Run Code Online (Sandbox Code Playgroud)