我有两个变量:x和y。 x包含在y中。 例如,
x y
1a abc 1a 39d
2b abc 2b 32i
3c ad ab 3c 32a 32
9d ab acb 9d 2d
N/A abc 329d
我想基于x将y分为两部分,如下所示。
x y1 y2
1a abc 39d
2b abc 32i
3c ad ab 32a 32
93d ab acb 2d
N/A abc 329d
任何建议,谢谢!
我知道gregexpr()
可以找到模式的位置,但是如何找到字符串“ x”的第一个和最后一个位置以分隔y?
答案 0 :(得分:1)
也许是这样吗?
df1 <- read.table(text=
"x y
1a 'abc 1a 39d'
2b 'abc 2b 32i'
3c 'ad ab 3c 32a 32'
9d 'ab acb 9d 2d'
N/A 'abc 329d'",h=T,strin=F)
library(tidyverse)
df1 %>%
mutate(y = ifelse(x == "N/A",
str_replace_all(y," "," | "),
str_replace_all(y,x,"|"))) %>%
separate(y,c("y1","y2"),sep = " \\| ")
# x y1 y2
# 1 1a abc 39d
# 2 2b abc 32i
# 3 3c ad ab 32a 32
# 4 9d ab acb 2d
# 5 N/A abc 329d
答案 1 :(得分:1)
通过在strsplit
上拆分y
,您几乎可以使用x
来获得所需的内容
df1 <- cbind(df[1], do.call("rbind", strsplit(df$y, df$x)))
df1
# x 1 2
#1 1a abc 39d
#2 2b abc 32i
#3 3c ad ab 32a 32
#4 9d ab acb 2d
#5 N/A abc 329d abc 329d
对于“ N / A”情况,由于它将始终具有两个部分,我们可以在空白处将其拆分,并在特定索引中替换它们。
inds <- df$x == "N/A"
df1[inds, 2:3] <- do.call("rbind", strsplit(df$y[inds], "\\s+"))
df1
# x 1 2
#1 1a abc 329d
#2 2b 329d abc
#3 3c abc 329d
#4 9d 329d abc
#5 N/A abc 329d