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)
这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)