r - 检查包含字符串列表的数据框中的字符串
问题描述
我正在尝试找到一种方法来查找数据框中的多个值并返回一个值。简化示例:
df1 <- read.table(text="chk1 chk2 chk3 value
xx aa;bb;cc jj 1
xx;yy dd;ee;ff kk 2
zz gg;hh;ii ll;nn 3", header=T)
df2 <- read.table(text="val1 val2 val3
xx bb jj
xx dd kk
yy ee kk
zz hh jj
", header=T)
查找值val1
,val2
和val3
from df2
in df1
,返回值 from df1
。
期望的结果:
df2 <- read.table(text="
val1 val2 val3 value
xx bb jj 1
xx dd kk 2
yy ee kk 2
zz hh jj NA
")
尝试match x %in% y
并循环遍历行,无法使其正常工作。
解决方案
这是一种可能性:
library(tidyverse)
df3 <- df2 %>% rowwise %>%
mutate(rowmatch=which(grepl(val1, df1$chk1) &
grepl(val2, df1$chk2) &
grepl(val3, df1$chk3))[1],
value=df1$value[rowmatch])
结果:
# A tibble: 4 x 5
val1 val2 val3 rowmatch value
<chr> <chr> <chr> <int> <int>
1 xx bb jj 1 1
2 xx dd kk 2 2
3 yy ee kk 2 2
4 zz hh jj NA NA
笔记:
- 这
[1]
是为了确保只使用匹配行中的第一行。 - 请注意,尽管
rowmatch
和value
在此示例中相同,但这只是因为df1$value
等于行号。 tibble
行为类似于 data.frame,但如果您真的更喜欢数据框,请添加%>% as.data.frame
可以对基数 R 进行相同的操作并应用:
df2$rowmatch <- with(df1, apply(df2, 1, function(x)
which(grepl(x["val1"], chk1) &
grepl(x["val2"], chk2) &
grepl(x["val3"], chk3))[1]))
df2$value <- df1$value[df2$rowmatch]