鉴于此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$x在df$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)
在将列拆分成碎片之后,可以使用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)