ColA ColB
D41 D410
D56 D411
D561 D412
D58 D60
D600 D70
В R, как я могу получить значения, в которых совпадают первые 3 символа из 2 разных столбцов? В приведенном выше примере это означает, что D41, D410, D411, D412, D600 и D60 являются результатами сопоставления. ,
Можно ли это сделать с помощью функции фильтра gsub и dplyr?
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))
Вы можете сделать следующее:
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)
Теория множеств может пригодиться и здесь, с 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"
Похожие вопросы
Новые вопросы
r
R - это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, предоставьте минимальные и воспроизводимые примеры вместе с желаемым результатом. Используйте dput () для данных и укажите все небазовые пакеты с вызовами library (). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. По вопросам, связанным со статистикой, используйте https://stats.stackexchange.com.