如何基于另一个变量分离变量

时间:2019-01-18 15:14:09

标签: r

我有两个变量: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?

2 个答案:

答案 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