我有一个数据库如下:
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
答案 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)