如果元素存在于带有位置的逗号分隔列中,请逐行检查

Jas*_*lns 4 r

鉴于此data.frame:

#    x     y
# 1  a b,c,d
# 2  c b,c,d
# 3  c b,c,d
# 4  a e,f,g
# 5  a b,c,d
# 6  c a,b,c
# 7  b b,c,d
# 8  c  <NA>
# 9  c e,f,g
# 10 a  <NA>
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

#    x     y pos contains
# 1  a b,c,d  NA    FALSE
# 2  c b,c,d   2     TRUE
# 3  c b,c,d   2     TRUE
# 4  a e,f,g  NA    FALSE
# 5  a b,c,d  NA    FALSE
# 6  c a,b,c   3     TRUE
# 7  b b,c,d   1     TRUE
# 8  c  <NA>  NA       NA
# 9  c e,f,g  NA    FALSE
# 10 a  <NA>  NA       NA
Run Code Online (Sandbox Code Playgroud)

也就是说,检查(按行)是否df$xdf$y并给出其位置.我开始沿着这strsplit(df$y, ",")条路走下去,但事情变得很复杂,我知道有一个简单的解决方案.


代码重现:

set.seed(5)
seq_letters <- c("a,b,c", "b,c,d", "e,f,g", NA)
df <- data.frame(x = sample(letters[1:3], 10, TRUE),
                 y = sample(seq_letters, 10, TRUE),
                 stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

Ric*_*ven 6

在将列拆分成碎片之后,可以使用match()with mapply()来查找第一列y.然后我们可以基于此构建第二列.

df$pos <- mapply(match, df$x, strsplit(df$y, ",", fixed = TRUE), USE.NAMES = FALSE)
df$contains <- replace(!is.na(df$pos), is.na(df$y), NA)
Run Code Online (Sandbox Code Playgroud)

这使

   x     y pos contains
1  a b,c,d  NA    FALSE
2  c b,c,d   2     TRUE
3  c b,c,d   2     TRUE
4  a e,f,g  NA    FALSE
5  a b,c,d  NA    FALSE
6  c a,b,c   3     TRUE
7  b b,c,d   1     TRUE
8  c  <NA>  NA       NA
9  c e,f,g  NA    FALSE
10 a  <NA>  NA       NA
Run Code Online (Sandbox Code Playgroud)