【问题标题】:How to find a subset of names in another column?如何在另一列中查找名称子集?
【发布时间】:2020-05-16 05:27:57
【问题描述】:

我有一个如下所示的文件名列表:

files$name <-c("RePEc.aad.ejbejj.v.1.y.2010.i.0.p.84.pdf", "RePEc.aad.ejbejj.v.12.y.2017.i.2.p.1117.pdf", "RePEc.aad.ejbejj.v.2.y.2011.i.0.p.17.20.pdf", "RePEc.aad.ejbejj.v.2.y.2011.i.0.p.60.62.pdf")

我有一个更长的 ID 列表,它是更大数据框的一列,其中一些对应于文件名列表 (names),但这些名称有不同的标点符号。该列如下所示:

df$repec_id <- c("RePEc:aad.ejbejj:v:1:y:2010:i:0:p:84", "RePEc:aad:ejbejj:v:12:y.2017:i:2:p:1117", "RePEc:aad:ejbejj:v:2:y:2011:i:0:p:17-20", "RePEc:aad:ejbejj:v:2:y:2011:i:0:p:60-62", "RePEc:aad.ejbejj:v:1:y:2010:i:0:p:99","RePEc:aad.ejbejj:v:1:y:2010:i:0:p:103")

我想对df$repec_id 中的列表进行子集化,这样我就只有与files$name 中的文件名对应的字符串,但它们有不同的标点符号。换句话说,我想要一个如下所示的输出:

ID_subset <- c("RePEc:aad.ejbejj:v:1:y:2010:i:0:p:84", "RePEc:aad:ejbejj:v:12:y.2017:i:2:p:1117", "RePEc:aad:ejbejj:v:2:y:2011:i:0:p:17-20", "RePEc:aad:ejbejj:v:2:y:2011:i:0:p:60-62")

最初,我认为从两个列表中删除所有特殊字符然后比较它们会起作用。所以我这样做了:

files$name <- str_replace_all(files$name, "\\.pdf", "")
files$name <- str_replace_all(files$name, "[[:punct:]]", "")
df$repec_id <- str_replace_all(files$name, "[[:punct:]]", "")
subset <- df[trimws(df$repec_id) %in% trimws(files$name), ]

但是,我需要一种方法来保留 df$repec_id 中 ID 的原始结构,因为我需要提供来自 df$repec_id 的 ID 列表,这些 ID 不在子集中。有没有人有什么建议?提前感谢您的帮助!

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用

    !gsub('[^[:alnum:]]+', '', df$repec_id) %in% gsub('\\.pdf$|[^[:alnum:]]', '',files$name)
    #[1] FALSE FALSE FALSE FALSE  TRUE  TRUE
    

    【讨论】:

      【解决方案2】:

      您可以删除repec_idname 中的所有标点符号,并使用%in% 找出匹配的字符串。

      gsub('[[:punct:]]', '', df$repec_id) %in% 
                gsub('\\.pdf$|[[:punct:]]', '',files$name) 
      #[1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE
      

      如果你添加否定(!) 符号,你会得到不匹配的字符串。

      !gsub('[[:punct:]]', '', df$repec_id) %in% 
             gsub('\\.pdf$|[[:punct:]]', '',files$name) 
      #[1] FALSE FALSE FALSE FALSE  TRUE  TRUE
      

      这将保持与df$repec_id 相同的长度,因此您可以使用它来对df 中的行进行子集化。

      【讨论】:

      • 我可以确认它是相反的吗?我想找出哪些 files$name 值在 df$repec_id 中,所以我会写,例如 gsub('[[:punct:]]', '',files$name) %in% gsub(' \\.pdf$|[[:punct:]]', '',df$repec_id)
      • 是的,一般情况下,%in% 将返回 LHS 长度的输出。
      猜你喜欢
      • 1970-01-01
      • 2021-09-16
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2016-04-07
      • 1970-01-01
      • 2023-01-19
      相关资源
      最近更新 更多