根据与另一列的部分匹配创建新列

Posted

技术标签:

【中文标题】根据与另一列的部分匹配创建新列【英文标题】:Create new column based on partial match with another column 【发布时间】:2021-03-28 15:38:14 【问题描述】:

我想为数据框创建一个新列,在另一列中使用部分匹配。问题是我的值只是部分匹配,名称末尾的后缀 _3p 或 _5p 仅存在于原始数据框中,而不存在于我用来测试的另一列中。

我使用的代码应该可以工作,但由于部分匹配的事情不是,我被卡住了。

> head(df)
# A tibble: 6 x 2
  microRNAs                             `number of targets`
  <chr>                                               <int>
1 bantam|LQNS02278082.1_33125_3p                        128
2 bantam|LQNS02278082.1_33125_5p                          8
3 Dpu-Mir-10-P2_LQNS02277998.1_30984_3p                  44
4 Dpu-Mir-10-P2_LQNS02277998.1_30984_5p                  78
5 Dpu-Mir-10-P3_LQNS02277998.1_30988_3p                1076
6 Dpu-Mir-10-P3_LQNS02277998.1_30988_5p                 309

> dput(head(df))
structure(list(microRNAs = c("bantam|LQNS02278082.1_33125_3p", 
"bantam|LQNS02278082.1_33125_5p", "Dpu-Mir-10-P2_LQNS02277998.1_30984_3p", 
"Dpu-Mir-10-P2_LQNS02277998.1_30984_5p", "Dpu-Mir-10-P3_LQNS02277998.1_30988_3p", 
"Dpu-Mir-10-P3_LQNS02277998.1_30988_5p"), `number of targets` = c(128L, 
8L, 44L, 78L, 1076L, 309L)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

#matches to look for 

             unique
1 miR-9|LQNS02278094.1_36129
2       LQNS02278139.1_39527
3       LQNS02278139.1_39523
4       LQNS02278075.1_32386
5       Dpu-Mir-10-P3_LQNS02277998.1_30988

> dput(head(unique))
structure(list(unique = c("miR-9|LQNS02278094.1_36129", 
"LQNS02278139.1_39527", "LQNS02278139.1_39523", "LQNS02278075.1_32386", 
"Dpu-Mir-10-P3_LQNS02277998.1_30988")), row.names = c(NA, 
6L), class = "data.frame")

#Create new column with Yes, No 
df$new <- ifelse(df$microRNAs %in% unique$unique, 'Yes', 'No')

##But it all appears like No due to the partial match. 

【问题讨论】:

你可以试试fuzzyjoinregex_left_join(df, unique, by = c("microRNAs" = "unique"))stringdist_left_join 是的,它的工作原理非常好。我也考虑过合并您可以将其添加为答案,以便我投票吗?谢谢!!! 【参考方案1】:

使用data.table 的快速解决方案。

    library(data.table)
    
    # convert data.frame to data.table
    setDT(df)
    
    # create temporary column dropping the last 3 characters
    df[, microRNAs_short := substr(microRNAs ,1, nchar(microRNAs)-3) ]
    
    # check values in common
    df[, new := fifelse( microRNAs_short %in% df2$unique, 'Yes', 'No')]

【讨论】:

【参考方案2】:

我们可以使用来自fuzzyjoinregex_left_join

library(fuzzyjoin)
regex_left_join(df, unique, by = c("microRNAs" = "unique"))

【讨论】:

以上是关于根据与另一列的部分匹配创建新列的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:根据字符串的一部分是不是在另一列中的任何位置创建新列

Pandas:根据另一列的百分比增长率创建一个新列

Hive查询:根据条件选择一列,另一列值匹配某些特定值,然后将匹配结果创建为新列

返回值的公式,其中一列中的第一个单词与另一列的最后四位匹配

Pandas - 基于 str 包含从另一列创建新列/值

来自一列的 SQL UPDATE 数据与来自另一列的匹配