2015-11-18 1 views
-3

Я хотел бы сравнить два столбца одновременно. Мои данные выглядит следующим образом:Сравнение двух столбцов двух блоков данных (логических операторов)

a <- data.frame("a1" = c(1,1,1,3,4), "a2" = c(2,1,2,1,2)) 
b <- data.frame("b1" = c(1,1,3,1,3), "b2" = c(2,2,1,2,1)) 
cbind(a, b) 
# a1 a2 b1 b2 
# 1 1 2 1 2 
# 2 1 1 1 2 
# 3 1 2 3 1 
# 4 3 1 1 2 
# 5 4 2 3 1 

Я хотел бы, чтобы идентифицировать все строки а, где a1 не в b1или где a1 находится в b1ноa2 специальной a1 не в b2 для специальный b2. Итак, второй вопрос: когда a1 находится в b1, тогда a2 для этой строки для a1 также в b2 для этой строки для b1.

Пример для строки 2: Я проверяю, если a1 = 1 находится где угодно в b1 = c(1,1,3,1,3). Это так, я хочу проверить, a2 = 1 в строке 2 (где a1 = 1) находится где угодно в b2, где b1 = a1 = 1, поэтому здесь b2 = c(2, 2, 2). Для строки 2 a2 = 1 нет в b2 = c(2, 2, 2), поэтому результат должен показать мне эту строку.

Первый вопрос легко ответить на следующий код:

a[which(!(a$a1 %in% b$b1)), ] 
# a1 a2 
# 5 4 2 

Но я не могу исправить вторую проблему. Возможно, я неправильно работаю с логическими операторами. Мой результат должен выглядеть следующим образом:

a1 a2 
2 1 1 
4 4 2 
+0

Он не может работать с оператором '% in %'. Используя его, вы выполняете поиск во всех векторах без указания порядка. См., Например, результат 'c (1,2,3)% в% c (3,1,2)'. –

+1

Непонятно, хотите ли вы сделать это «по-гречески» или по всему миру. Но, как вы сказали, все 'a $ a2' находятся в' b $ b2', поэтому ваше «или» условие всегда «FALSE» – Cath

+0

@Pascal. Результатом вашего минимального примера является «TRUE TRUE TRUE» - и это то, что Я хочу. – user5514978

ответ

1

После объяснения в вашем редактирования, вы хотите, чтобы строки, в которых либо конкретный a1 из a не в b1 от b или где специфический a1 от aравноb1 той же строке в b и a2 из a не входит в число значений b2 из b строк, для которых b1 равно значению удельной a1.

В R, вы можете написать это так:

cond <- sapply(seq(nrow(a)), # check each row, one by one 
       function (i){ 
        !(a$a1[i] %in% b$b1) | # a1 of the specific row is not in b1 or 
        !(a$a2[i] %in% b$b2[b$b1==a$a1[i]]) # a2 of the specific row is not in the values of b2 for which b1 equals a1 of the sepcific row 
       }) 

a[cond, ] 
# a1 a2 
#2 1 1 
#5 4 2 
+0

Спасибо за ваш ответ. Функция работает для этих данных примера, но для моих реальных данных я не хочу сравнивать строку за строкой, потому что длина строк двух данных является не одинаковой, а значения для 'a1' и' b1' 't должны появляться в той же строке. Но это моя вина. Я изучаю этот вопрос. В следующий раз я должен более подробно описать свою проблему и выбрать лучшие данные примера. Но я решил выбрать их как можно проще. – user5514978

+0

@ user5514978, я отредактировал свой ответ, я думаю, что теперь он должен работать с вашими данными (я не могу быть уверен, поскольку мне все еще немного непонятно, что вы действительно хотите) – Cath

+0

Спасибо, действительно, очень за ваши усилия, несмотря на мои плохие объяснение. Он работает сейчас. Я также нашел (плохо запрограммированное) решение с помощью for-loops (см. Выше). – user5514978

0

На основании вашего ответа я улучшил тест функции(). Эта версия возвращает dataframe:

a <- data.frame(a1=c(1,1,1,3,4), a2=c(2,1,2,1,2)) 
b <- data.frame(b1=c(1,1,3,1,3), b2=c(2,2,1,2,1)) 

test <- function (a, b) { 
    R <- subset(a,!a1 %in% b$b1) 

    I <- unique(a$a1[a$a1 %in% b$b1]) 
    for (i in I) { 
    ai <- subset(a, a1 == i) 
    bi <- subset(b, b1 == i) 
    J <- unique(bi$b2) 
    for (j in unique(ai$a2)) if (! j %in% J) R <- rbind(subset(ai, a2==j), R) 
    } 
    R 
} 

test(a, b) 
+0

(как и выше): Спасибо за ваш ответ! Функция работает для этих данных примера, но для моих реальных данных я не хочу сравнивать строку за строкой, потому что длина строк двух данных является не одинаковой, а значения для 'a1' и' b1' 't должны появляться в той же строке. Но это моя вина. Я изучаю этот вопрос. В следующий раз я должен более подробно описать свою проблему и выбрать лучшие данные примера. Но я решил выбрать их как можно проще. – user5514978

+0

@ user5514978: Я отредактировал свой ответ на основе вашей функции. – jogo

0

явно не хорошее решение, но оно работает с моими данными (неравный размер строк двух наборов данных, а не то же самое положение значений в переменных) - здесь с новым например, потому что я выбрал первый действительно плохой.

a <- data.frame("a1" = c(1,1,1,3,4), "a2" = c(2,1,2,1,2)) 
b <- data.frame("b1" = c(1,3,1,1), "b2" = c(2,1,2,2)) 

test <- function (data1, data2) { 

    for (i in unique(data1[data1$a1 %in% data2$b1, "a1"])) { 
    temp_data1 <- data1[data1$a1 == i, c("a1", "a2")] 
    temp_data2 <- data2[data2$b1 == i, c("b1", "b2")] 

    for (j in unique(temp_data1$a2)) { 
     test <- j %in% unique(temp_data2$b2) 

     if (test == FALSE) { 
      print(unique(temp_data1[temp_data1$a1 == i & temp_data1$a2 == j, ])) 
     } 
    } 
    } 

    for (k in unique(data1[which(!(data1$a1 %in% data2$b1)), "a1"])) { 
    print(unique(data1[data1$a1 == k, c("a1", "a2")])) 
    } 
} 

test(a, b) 
    a1 a2 
2 1 1 
    a1 a2 
5 4 2 

 Смежные вопросы

  • Нет связанных вопросов^_^