Совпадение нескольких шаблонов / строк в R - PullRequest
0 голосов
/ 04 июля 2018

У меня есть два фрейма данных: один представляет собой карту с более чем 20000 возможностями, другой содержит 3 столбца из 30000 строк данных. Мне нужно использовать карту, чтобы выяснить правильное имя. Вот простой пример того, что мне нужно:

Например,

data <- data.frame(
  V1 = c('baa','bb','aa','cc','dd','ee','caa'),
  V2 = c('ff','gg','hh','yy','jj','kk','hh')
)
# V1 V2
# baa ff
# bb gg
# aa hh
# cc yy
# dd jj
# ee kk
# caa hh

map <- data.frame(
  V1 = c('aa','gg','cc','jj','kk'), 
  V2  = c(1:5)
) 
# V1 V2 
# aa 1
# gg 2
# cc 3
# jj 4
# kk 5

>what.I.need
V1 V2 V3
baa ff 1
bb gg 2
aa hh 1
cc yy 3
dd jj 4
ee kk 5
caa hh 1

Я пытался использовать grep, но я не могу понять, как заставить его работать с картой из 20000 возможностей и заполнить 3-й столбец в поле "what.I.need". Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 04 июля 2018
library(dplyr)
library(tidyr)

df1 <- data.frame(V1 = c("aa", "bb", "aa", "cc", "dd", "ee", "aa"), V2 = c("ff", "gg", "hh", "yy", "jj", "kk", "hh"), stringsAsFactors = FALSE)
df2 <- data.frame(V1 = c("aa", "gg", "cc", "jj", "kk"), V2 = c(1,2,3,4,5), stringsAsFactors = FALSE)

left_join(df1, df2, by = c("V2" = "V1")) %>% 
left_join(., df2, by = "V1") %>% 
  mutate(V3 = ifelse(is.na(V2.y), V2.y.y, V2.y)) %>% 
  select(-V2.y, -V2.y.y)

Создает эту таблицу, затем удаляет V2.y и V2.y.y.

  V1 V2.x V2.y V2.y.y V3
1 aa   ff   NA      1  1
2 bb   gg    2     NA  2
3 aa   hh   NA      1  1
4 cc   yy   NA      3  3
5 dd   jj    4     NA  4
6 ee   kk    5     NA  5
7 aa   hh   NA      1  1

Что дает вам это:

  V1 V2.x V3
1 aa   ff  1
2 bb   gg  2
3 aa   hh  1
4 cc   yy  3
5 dd   jj  4
6 ee   kk  5
7 aa   hh  1
0 голосов
/ 04 июля 2018

Вы можете попробовать это:

data <- data.frame(
  V1 = c('aa','bb','aa','cc','dd','ee','aa'),
  V2 = c('ff','gg','hh','yy','jj','kk','hh'), stringsAsFactors = F
)

map <- data.frame(
  V1 = c('aa','gg','cc','jj','kk'), 
  V2  = c(1:5), stringsAsFactors = F
)

data$V3.1 <- map$V2[match(data$V1, map$V1)]
data$V3.2 <- map$V2[match(data$V2,map$V1)]
data$V3 <- ifelse(!is.na(data$V3.1), data$V3.1, data$V3.2)
data
# V1 V2 V3.1 V3.2 V3
# 1 aa ff    1   NA  1
# 2 bb gg   NA    2  2
# 3 aa hh    1   NA  1
# 4 cc yy    3   NA  3
# 5 dd jj   NA    4  4
# 6 ee kk   NA    5  5
# 7 aa hh    1   NA  1
0 голосов
/ 04 июля 2018
df1 <- read.table(text = "
V1 V2
aa ff
bb gg
aa hh
cc yy
dd jj
ee kk
aa hh", h = T, stringsAsFactors = F)

df2 <- read.table(text = "
V1 V3 
aa 1
gg 2
cc 3
jj 4
kk 5", h = T, stringsAsFactors = F)


library(tidyr)
library(dplyr)

df1 %>% 
  gather(V2, V1, V1, V2) %>% 
  full_join(df2) %>% 
  filter(!is.na(V3)) %>% 
  full_join(df1) -> df1

df1$V3 <- c(df1$V3[!is.na(df1$V3)])

df1 %>% 
  filter(!V2 %in% c("V1","V2")) %>% 
  select(V1,V2,V3)

  V1 V2 V3
1 aa ff  1
2 bb gg  1
3 aa hh  3
4 cc yy  1
5 dd jj  2
6 ee kk  4
7 aa hh  5

У меня такое чувство, что оно может стать более кратким, чем это. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...