ColA   ColB

D41    D410
D56    D411
D561   D412
D58    D60
D600   D70

В R, как я могу получить значения, в которых совпадают первые 3 символа из 2 разных столбцов? В приведенном выше примере это означает, что D41, D410, D411, D412, D600 и D60 являются результатами сопоставления. ,

Можно ли это сделать с помощью функции фильтра gsub и dplyr?

4
spidermarn 3 Май 2019 в 06:25

3 ответа

Лучший ответ

Мы можем использовать 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))
4
akrun 3 Май 2019 в 04:04

Вы можете сделать следующее:

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, это будет работать с общими data.frames:

Matching <- df[substr(df$ColA, 1, 3) == substr(df$ColB, 1, 3),]
Matching_values <- substr(Matching$ColA, 1, 3)
1
Arturo Sbr 3 Май 2019 в 03:32

Теория множеств может пригодиться и здесь, с 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" 
1
thelatemail 3 Май 2019 в 04:37