【问题标题】:How to create a variable with a character chain present in a vector如何使用向量中存在的字符链创建变量
【发布时间】:2021-07-05 19:44:00
【问题描述】:

我有这个data.frame

c=c("AUSTOP","ATIP;AITUO", "BERTUI", "BHTREAK;PAERJR;KIEYTU", "FRTEU3", "IRTUFH","HAZEB", "ERTUJG;JIRTUE;HERTYE", "DAIER1", "ZERV")

pos=c(1,2,3,4,5,6,7,8,9,10)
data=data.frame(pos, c, xab)

> data
   pos                     c
1    1                AUSTOP
2    2            ATIP;AITUO
3    3                BERTUI
4    4 BHTREAK;PAERJR;KIEYTU
5    5                FRTEU3
6    6                IRTUFH
7    7                 HAZEB
8    8  ERTUJG;JIRTUE;HERTYE
9    9                DAIER1
10  10                  ZERV

还有这个向量:

xa=c("AUSTOP", "HTURIE", "IRTUFH", "JEURTU", "AITUO", "ERTUJG", "HERTYE", "DAIER", "ZERV1")

我想为每一行创建另一个变量,其中所有字符链都存在于 c 变量和 xa 向量中,如下所示:

> data2
   pos                     c           xab
1    1                AUSTOP        AUSTOP
2    2            ATIP;AITUO         AITUO
3    3                BERTUI        BERTUI
4    4 BHTREAK;PAERJR;KIEYTU          <NA>
5    5                FRTEU3          <NA>
6    6                IRTUFH        IRTUFH
7    7                 HAZEB          <NA>
8    8  ERTUJG;JIRTUE;HERTYE ERTUJG;HERTYE
9    9                DAIER1          <NA>
10  10                  ZERV          <NA>

如果 tidyverse 有解决方案,那就太好了。

【问题讨论】:

  • 在你的xa 向量中没有'BERTUI'
  • @Patrick。提示 - 不要将 c 用作变量名 - 因为 c 也用作函数,您最终可能会使用该变量名做一些意想不到的事情
  • 感谢您的这些通知。我同意使用 c 作为变量名不是一个好主意。我通常不习惯,这只是为了举例,但我会尽量避免它。

标签: r dataframe tidyverse


【解决方案1】:

我们可以通过paste将'xa'与collapse一起作为|创建单个模式,使用str_extract_all从'c'列中获取与模式匹配的所有字符串,循环listpaste 他们

library(dplyr)
library(stringr)
library(purrr)
data %>% 
    mutate(new = map_chr(str_extract_all(c, str_c("\\b(", str_c(xa,
        collapse="|"), ")\\b")), str_c, collapse=";"))

-输出

  pos                     c           new
1    1                AUSTOP        AUSTOP
2    2            ATIP;AITUO         AITUO
3    3                BERTUI        BERTUI
4    4 BHTREAK;PAERJR;KIEYTU              
5    5                FRTEU3              
6    6                IRTUFH        IRTUFH
7    7                 HAZEB              
8    8  ERTUJG;JIRTUE;HERTYE ERTUJG;HERTYE
9    9                DAIER1              
10  10                  ZERV  

数据

xa <- c("AUSTOP", "HTURIE", "IRTUFH", "JEURTU", "AITUO", "ERTUJG", 
"HERTYE", "DAIER", "ZERV1", "BERTUI")
data <- structure(list(pos = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), c = c("AUSTOP", 
"ATIP;AITUO", "BERTUI", "BHTREAK;PAERJR;KIEYTU", "FRTEU3", "IRTUFH", 
"HAZEB", "ERTUJG;JIRTUE;HERTYE", "DAIER1", "ZERV")), 
class = "data.frame", row.names = c(NA, 
-10L))

【讨论】:

  • 感谢您提供此解决方案,但我需要完全匹配。我编辑了我以前的帖子以显示一个不起作用的示例 -> 在第 9 行:DAIER 被检测为 DAIER1 上的匹配项
  • @PatrickParts 我更改为添加单词边界
  • @PatrickParts 请检查更新。我在你的“xa”向量中添加了BERTUI
  • 谢谢,现在可以按我的意愿工作了。我将测试我的数据并尝试了解这些函数的工作原理。
  • 我回来找你,因为我发现了一个你的解决方案不起作用的案例,我想知道如何考虑这个案例以获得我想要的。当 c 列中的字符串包含“-”时,这不起作用。例如,如果我在 c 列中有“TEA-1”,在 xa 向量中有“TEA”,它会将其检测为完全匹配,但对我来说不是。如何调整此代码以使“-”不被视为单词边界?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2021-12-13
  • 2014-08-26
相关资源
最近更新 更多