2013-04-20 2 views
3

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

Моя проблема противоположна - я хочу сопоставить кадры данных на основе подмножеств. Чтобы быть конкретным, я хотел бы сопоставить подмножества столбца во втором кадре данных со всем столбцом первого кадра данных и затем создать новые столбцы в первом кадре данных, которые показывают, было ли выполнено совпадение для каждого подмножество.

Эти подмножества могут иметь различное количество строк. С помощью двух фиктивных данных фреймов ниже ...

DF1 <- data.frame(number=1:10) 

DF2 <- data.frame(category = rep(c("A","B","C"), c(5,7,3)), 
        number = sample(10, size=15, replace=T)) 

... цель будет заключаться в создании трех новых столбцов (DF1$A, DF1$B и DF$C), которые показывают ли значение в DF1$number матче со значениями в DF2$number для каждого из соответствующих подмножеств DF2$category. В идеале строки в этих новых столбцах будут показывать «1», если совпадение было сделано, и «0», если совпадение не имеет. С приведенными ниже фиктивными данными я получаю DF1, имеющий 4 столбца (DF1$number, DF1$A, DF1$B и DF$C) по 10 рядов по каждому.

Обратите внимание, что в моем фактическом втором кадре данных у меня есть огромное количество категорий, поэтому я не хочу их вводить отдельно для любой операции, необходимой для достижения этой цели. Надеюсь это имеет смысл! Извините, если я пропущу что-то очевидное и очень благодарю за любую помощь, которую вы могли бы предоставить.

ответ

2

Это должно работать:

sapply(split(DF2$number, DF2$category), function(x) DF1$number %in% x + 0) 

     A B C 
[1,] 0 0 1 
[2,] 1 1 0 
[3,] 1 1 1 
[4,] 0 1 0 
[5,] 0 0 1 
[6,] 0 1 0 
[7,] 1 1 0 
[8,] 1 0 0 
[9,] 1 0 0 
[10,] 0 1 0 

Вы можете добавить обратно в DF1 как:

data.frame(
    DF1, 
    sapply(split(DF2$number, DF2$category), function(x) DF1$number %in% x + 0) 
     ) 

    number A B C 
1  1 0 0 1 
2  2 1 1 0 
3  3 1 1 1 
4  4 0 1 0 
5  5 0 0 1 
6  6 0 1 0 
7  7 1 1 0 
8  8 1 0 0 
9  9 1 0 0 
10  10 0 1 0 
+0

Да, это работает отлично. Огромное спасибо! Спасибо также Энди за редактирование, чтобы улучшить ясность моего оригинального сообщения. – user2093526

+0

@ user2093526 - без проблем, рад помочь - если это ответит на вопрос, отметьте отметку «отметьте» рядом со стрелками вверх/вниз, чтобы сигнализировать об этом. – thelatemail

+0

Вместо этого можно использовать _tapply_, 'tapply (DF2 $ number, DF2 $ category, function (x) DF1 $ number% in% x + 0)' –