首页 > 解决方案 > 检查包含字符串列表的数据框中的字符串

问题描述

我正在尝试找到一种方法来查找数据框中的多个值并返回一个值。简化示例:

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,val2val3from df2in 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并循环遍历行,无法使其正常工作。

标签: r

解决方案


这是一种可能性:

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]是为了确保只使用匹配行中的第一行。
  • 请注意,尽管rowmatchvalue在此示例中相同,但这只是因为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]

推荐阅读