ColA ColB
D41 D410
D56 D411
D561 D412
D58 D60
D600 D70
在R中,我怎样才能获得两个不同列的前三个字符相匹配的值?在上面的例子中,这意味着D41、D410、D411、D412、D600和D60是匹配结果。
使用gsub和dplyr的过滤函数相结合可以实现吗?
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))
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)
这里也可能会用到集合论中的 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"
Reduce
和intersect
,但没有深入研究。 - akrun
data.frame
解决方案。 - Arturo Sbr