在R中,如何匹配来自两个不同列的值的前三个字符?

4
ColA   ColB

D41    D410
D56    D411
D561   D412
D58    D60
D600   D70

在R中,我怎样才能获得两个不同列的前三个字符相匹配的值?在上面的例子中,这意味着D41、D410、D411、D412、D600和D60是匹配结果。
使用gsub和dplyr的过滤函数相结合可以实现吗?
3个回答

4
我们可以使用 substr 根据位置获取子字符串,然后进行比较(如果需要逐元素比较,则使用 ==)。
substr(df1$ColA, 1, 3) == substr(df1$ColB, 1, 3)

或使用%in%进行整列比较

v1 <- c(df1$ColA[substr(df1$ColA, 1, 3) %in% substr(df1$ColB, 1, 3)],
         df1$ColB[substr(df1$ColB, 1, 3) %in% substr(df1$ColA, 1, 3)])
unique(v1)
#[1] "D41"  "D600" "D410" "D411" "D412" "D60" 

或者使用 tidyverse

library(tidyverse)
list(df1, df1[2:1]) %>% 
     map( ~  .x %>%
       reduce(., ~  
         keep(.x,  substr(.x, 1, 3) %in%  substr(.y, 1, 3)))) %>% 
         flatten_chr
#[1] "D41"  "D600" "D410" "D411" "D412" "D60" 

或者使用

Reduce(`==`, lapply(df1, substr, 1, 3))

数据

df1 <- structure(list(ColA = c("D41", "D56", "D561", "D58", "D600"), 
ColB = c("D410", "D411", "D412", "D60", "D70")), class = "data.frame", 
 row.names = c(NA, -5L))

1
你可以做以下事情:

install.packages("data.table")
library(data.table)
Matching <- df[substr(ColA, 1, 3) == substr(ColB, 1, 3)]
Matching_values <- substr(Matching$ColA, 1, 3)

另外,如果您不想使用data.table,在常见的数据框上也可以使用以下方法:

Matching <- df[substr(df$ColA, 1, 3) == substr(df$ColB, 1, 3),]
Matching_values <- substr(Matching$ColA, 1, 3)

@akrun 唉...我甚至没有读你的代码。我们发布了一个常见的data.frame解决方案。 - Arturo Sbr
@akrun,我在第二次编辑中的两个解决方案中都添加了“Matching_values”。晚安伙计。 - Arturo Sbr

1

这里也可能会用到集合论中的 intersect,请看:

x <- unlist(df1, use.names=FALSE)
x[substr(x,1,3) %in% Reduce(intersect, Map(substr, df1, 1, 3))]
#[1] "D41"  "D600" "D410" "D411" "D412" "D60" 

这个不错。我也在尝试使用Reduceintersect,但没有深入研究。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接