2014-07-08 2 views
3

Как получить логические схемы разделяемых строк из двух фреймов данных?логики разделяемых строк из двух фреймов данных

> a <- data.frame(x = 1:5, y = 7:11) 
> b <- data.frame(x = c(4, 2, 6, 3, 3, 1), y = c(10, 16, 7, 9, 9, 7)) 
> a 
    x y 
1 1 7 
2 2 8 
3 3 9 
4 4 10 
5 5 11 
> b 
    x y 
1 4 10 
2 2 16 
3 6 7 
4 3 9 
5 3 9 
6 1 7 
> a.indices <- c(TRUE, FALSE, TRUE, TRUE, FALSE) 
> b.indices <- c(TRUE, FALSE, FALSE, TRUE, TRUE, TRUE) 

Я хотел бы вернуть a.indices или b.indices.

+0

В зависимости от вашего следующего шага вы можете попробовать «merge (b, a)». Это делает то же самое, что и 'b [b.indices,]'. – bdemarest

+0

@bdemarest - 'merge', кажется, предлагает себя здесь - я добавил ответ на точный вопрос, включающий его. – thelatemail

ответ

2

Вы можете сделать combinaton, что merge и %in% делает

a.indices <- match(
    do.call(paste, c(a, sep="\r")), 
    do.call(paste, c(b, sep="\r")), nomatch=0 
)>0 

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

b.indices <- Reduce(function(vprev,vnow) vprev & !is.na(vnow), 
    Map(match, b,a), init=T) 

(для обоих этих методов вы можете поменять a и b получить противоположный результат). Вы можете протестировать сравнение производительности в своем конкретном сценарии.

+0

Ваше первое решение работает для меня, но я этого не понимаю. Как все функции do.call, paste и c работают вместе? c (a, sep = "\ r") создает кадр данных с именами столбцов x, y и sep. do.call применяет вставку к трем столбцам кадра данных. Что я не понимаю? – George

+1

'do.call' выполняет функцию и список и вызывает функцию, используя значения в списке в качестве параметров. По сути, это вызов 'paste (a $ x, a $ y, sep =" \ r ")', но таким образом он будет работать для любого количества столбцов. Он превращает все столбцы в один мегаколон (вектор), поскольку 'match' работает только с атомными векторами. Также 'c (a, sep =" \ r ")' не добавляет столбец в data.frame 'a'. Он переводит 'a' в простой список, а затем добавляет дополнительный элемент в этот список. Мы никогда не добавляем новый столбец в 'a' (или' b'). – MrFlick

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