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

时间:2016-05-14 07:37:11

标签: r split 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

我想删除第1列中的半冒号,如果包含超过一个X的第1列,它将复制新行。 此外,第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

2 个答案:

答案 0 :(得分:2)

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

library(dplyr)
library(tidyr)

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

,并提供:

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

答案 1 :(得分:1)

我们可以使用cSplit

library(splitstackshape)
cSplit(dat, "col1", ";", "long")[col1!=""][duplicated(col4), col4 := as.numeric(0)][]
#    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

数据

col2 = col3 = col4 <- c(5,8,4,1)
 dat <- data.frame(col1,col2,col3,col4)