Соедините 2 кадра данных, если совпадают два столбца - PullRequest
0 голосов
/ 09 мая 2018

У меня есть 2 кадра:

CountryPoints

From.country  To.Country points
Belgium       Finland    4
Belgium       Germany    5
Malta         Italy      12
Malta         UK         1

и другой кадр данных с соседними / граничащими странами:

From.country    To.Country 
    Belgium       Finland   
    Belgium       Germany   
    Malta         Italy   

Я хотел бы добавить еще один столбец в CountryPoints, называемый соседом (Y / N), в зависимости от того, найдена ли пара значений ключей в кадре данных соседних / граничащих стран. Возможно ли это как-то - так что это своего рода объединение, но результатом должен быть логический столбец.

Результат должен быть:

From.country  To.Country points  Neighbour
    Belgium       Finland    4    Y
    Belgium       Germany    5    Y
    Malta         Italy      12   Y
    Malta         UK         1    N

В приведенном ниже вопросе показано, как можно объединить, но не показано, как можно добавить этот дополнительный логический столбец

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Два альтернативных подхода:

1) с основанием R:

idx <- match(df1$From.country, df2$From.country, nomatch = 0) &
  match(df1$To.Country, df2$To.Country, nomatch = 0)
df1$Neighbour <- c('N','Y')[1 + idx]

2) с data.table:

library(data.table)
setDT(df1)
setDT(df2)

df1[, Neighbour := 'N'][df2, on = .(From.country, To.Country), Neighbour := 'Y'][]

, которые оба дают (data.table -выход на выходе):

   From.country To.Country points Neighbour
1:      Belgium    Finland      4         Y
2:      Belgium    Germany      5         Y
3:        Malta      Italy     12         Y
4:        Malta         UK      1         N
0 голосов
/ 09 мая 2018

Заимствование идеи из этого поста :

df1$Neighbour  <- duplicated(rbind(df2[, 1:2], df1[, 1:2]))[ -seq_len(nrow(df2)) ]

df1
#   From.country To.Country points Neighbour
# 1      Belgium    Finland      4      TRUE
# 2      Belgium    Germany      5      TRUE
# 3        Malta      Italy     12      TRUE
# 4        Malta         UK      1     FALSE
0 голосов
/ 09 мая 2018

Как насчет этого?

sortpaste <- function(x) paste0(sort(x), collapse = "_");
df1$Neighbour <- apply(df1[, 1:2], 1, sortpaste) %in% apply(df2[, 1:2], 1, sortpaste)
#  From.country To.Country points Neighbour
#1      Belgium    Finland      4      TRUE
#2      Belgium    Germany      5      TRUE
#3        Malta      Italy     12      TRUE
#4        Malta         UK      1     FALSE

Пример данных

df1 <- read.table(text =
    "From.country  To.Country points
Belgium       Finland    4
Belgium       Germany    5
Malta         Italy      12
Malta         UK         1", header = T)

df2 <- read.table(text =
    "From.country    To.Country
    Belgium       Finland
    Belgium       Germany
    Malta         Italy", header = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...