Если значения нескольких столбцов равны в разных размерах кадра данных - R - PullRequest
0 голосов
/ 13 мая 2019

У меня есть два кадра данных с двумя столбцами в каждом, и я хочу знать, как создать вектор с 1, когда оба значения находятся в другом кадре данных, или 0, где оба нет.

x <- data.frame(A = c(1,2,3,4,5,6,7,1),
                B = c(10,1,30,1,50,60,1,80),
                stringsAsFactors = FALSE)
y <- data.frame(C = c(1,2,3,4,5,6,7,8,9,10),
                D = c(1,20,30,40,50,60,70,80,90,100),
                stringsAsFactors = FALSE)

vector <- ifelse(y$C == x$A & y$D == x$B, 1,0) # This works when both dataframe are the same size.

Работает, когда размер кадра данных одинаковый, но когда его нет, я не могу использовать %in%, так как он оценивает, находится ли A в C и если B находится в D, когда я пытаюсь оценить, находятся ли A и B в C и D одновременно.

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Важен ли порядок строк вообще?

library(tidyverse)

x <- mutate(x, id=as.character(1:nrow(x)))
y <- mutate(y, id=as.character(1:nrow(y)))

xy <- full_join(y, x, by="id")

xy %>% mutate(result = ifelse(C == A & D == B, 1,0) 
                )

Что, как вы ожидаете, должно произойти со строками в y, у которых нет "соответствия" на x?

    C   D id  A  B result
1   1   1  1  1 10      0
2   2  20  2  2  1      0
3   3  30  3  3 30      1
4   4  40  4  4  1      0
5   5  50  5  5 50      1
6   6  60  6  6 60      1
7   7  70  7  7  1      0
8   8  80  8  1 80      0
9   9  90  9 NA NA     NA
10 10 100 10 NA NA     NA
1 голос
/ 13 мая 2019

Я думаю, что это поможет:

library(dplyr)
x <- data.frame(A = c(1,2,3,4,5,6,7,1),
                B = c(10,1,30,1,50,60,1,80),
                stringsAsFactors = FALSE) %>% 
  mutate(key = paste0(A, B, "_"))
y <- data.frame(C = c(1,2,3,4,5,6,7,8,9,10),
                D = c(1,20,30,40,50,60,70,80,90,100),
                stringsAsFactors = FALSE) %>% 
  mutate(key = paste0(C, D, "_"))

vector <- ifelse(y$key %in% x$key, 1,0)

Я думаю, что вы после ключевого отношения между двумя фреймами данных (например, что AB = CD).Если так, то вышеприведенное должно работать нормально.

...