2013-12-18 2 views
4

У меня есть data.frame v, что я хотел бы использовать уникальные строки изИспользуйте уникальные строки из data.frame подмножеству другого data.frame

#v 
    DAY MONTH YEAR 
1 1  1 2000 
2 1  1 2000 
3 2  2 2000 
4 2  2 2000 
5 2  3 2001 

подмножеству в data.frame w.

# w 
    DAY MONTH YEAR V1 V2 V3 
1 1  1 2000 1 2 3 
2 1  1 2000 3 2 1 
3 2  2 2000 2 3 1 
4 2  2 2001 1 2 3 
5 3  4 2001 3 2 1 

В результате data.frame vw. Там, где остались только строки в 'w', которые соответствуют уникальным строкам (например, (DAY, MONTH, YEAR)) в v.

# vw 
    DAY MONTH YEAR V1 V2 V3 
1 1  1 2000 1 2 3 
2 2  2 2000 2 3 1 

Прямо сейчас я использую следующий код, где я слить data.frames, а затем использовать ddply выбрать только первый/уникальное мировоззрение экземпляр строки. Эта работа, но станет громоздкой, если я должен включить V1=x$V1[1] и т. Д. Для всех моих переменных в части кода ddply. Есть ли способ использовать первый экземпляр (DAY, MONTH, YEAR) и остальные столбцы в этой строке?

Или, есть ли другой подход к проблеме использования уникальных строк от одного data.frame до подмножества другого data.frame?

v <- structure(list(DAY = c(1L, 1L, 2L, 2L, 2L), MONTH = c(1L, 1L, 
2L, 2L, 3L), YEAR = c(2000L, 2000L, 2000L, 2000L, 2001L)), .Names = c("DAY", 
"MONTH", "YEAR"), class = "data.frame", row.names = c(NA, -5L 
)) 

w <- structure(list(DAY = c(1L, 1L, 2L, 2L, 3L), MONTH = c(1L, 1L, 
2L, 2L, 4L), YEAR = c(2000L, 2000L, 2000L, 2001L, 2001L), V1 = c(1L, 
3L, 2L, 1L, 3L), V2 = c(2L, 2L, 3L, 2L, 2L), V3 = c(3L, 1L, 1L, 
3L, 1L)), .Names = c("DAY", "MONTH", "YEAR", "V1", "V2", "V3" 
), class = "data.frame", row.names = c(NA, -5L)) 

vw_example <- structure(list(DAY = 1:2, MONTH = 1:2, YEAR = c(2000L, 2000L), 
    V1 = 1:2, V2 = 2:3, V3 = c(3L, 1L)), .Names = c("DAY", "MONTH", 
"YEAR", "V1", "V2", "V3"), class = "data.frame", row.names = c(NA, 
-2L)) 

wv_inter <- merge(v, w, by=c("DAY","MONTH","YEAR")) 

vw <- ddply(www,.(DAY, MONTH, YEAR),function(x) data.frame(DAY=x$DAY[1],MONTH=x$MONTH[1],YEAR=x$YEAR[1], V1=x$V1[1], V2=x$V2[1], V3=x$V3[1])) 

ответ

3

В базовой R, я бы unique клиновых первого до слияния. Команда merge по умолчанию объединяется с именами общих столбцов, поэтому здесь не требуется by.

vw <- merge(unique(v), w) 

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

vw <- ddply(www,.(DAY, MONTH, YEAR),function(x) x[1,]) 
+0

'+ 1' за чистый ответ, но' ddply' далеко от 'base R' –

+0

@RicardoSaporta Согласен; «base R» предназначалось для изменения только первой строки, состоящей из 'unique' и' merge'. Следующая строка 'ddply' - попытка упростить последнюю строку кода OP в исходном подходе OP. –

+0

Этот подход работает. Просто удалите финальную ')' во второй команде. Выполняет ли 'function (x) x [1,]' как первую уникальную строку x? – nofunsally

3
library(data.table) 
v <- data.table(v) 
w <- data.table(w) 

setkey(v) 
setkeyv(w, names(v)) 

# if you want to capture ALL unique values of `v`, use: 
w[unique(v, by=NULL)] 

# if you want only values that mutually exist in `v` and `w` use: 
w[unique(v, by=NULL), nomatch=0L] 
+0

+1. Является 'by = NULL' необходимым в' unique.data.table'? По умолчанию используется 'by = key (x)'. –

+0

Я думаю, что 'by = key (v)' (по умолчанию) здесь имеет смысл ... – Arun

1

Редакцией:

Вместо слияния уникальный v с w , чтобы получить уникальный vw первый слияние v и w, а затем выберите значения, уникальные на столбцах DAY MONTH YEAR.

vw <- merge(v, w, by=c("DAY","MONTH","YEAR")) 
vw <- vw[which(! duplicated(vw[,c("DAY","MONTH","YEAR")])), ] 
+0

Этот подход приводит к 3-строчному кадру данных. 2 строки являются дубликатами в терминах «ДЕНЬ», «МЕСЯЦ», «ГОД» – nofunsally

+0

Извинения. Я неправильно понял ваш запрос. Это объединяет уникальные значения 'v' с' w'. Подход 'vw <- merge (v, w, by = c (" DAY "," MONTH "," YEAR ")), за которым следует' vw <- vw [который (! Duplicated (vw [, c ("DAY "," MONTH "," YEAR ")])),]' Возвращает уникальные значения 'vw' после слияния' vw'. Но это все академическое сейчас! – keithing

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