2016-09-26 2 views
-3

Я хочу присоединиться к двум таблицам (timeseries), сохраняя каждую левую запись (и НЕ добавляя справа) и добавляя вещи справа, только когда они существуют слева и справа. Вид левого внутреннего соединения (которого, вероятно, не существует).Присоединитесь к 2 кадрам данных, сохраняя точную левую таблицу

Например, я хочу присоединиться к А с B и хотите получить AB:

A= 
    1 
    2 
    3 
    4 

    B= 
    1 X 
    2 Y 
    2 Z 
    4 Z 
    5 ZZ 

    AB= 
    1 X 
    2 NaN 
    3 NaN 
    4 Z 

2 и 3 являются NaN, поскольку 2 существует несколько раз и 3 не существует на правой стороне

Спасибо за помощь

+1

Пожалуйста, прочитайте информацию о [как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) и как дать [воспроизводимый пример] (http://stackoverflow.com/questions/ 5963269/как к Make-A-пра-р-воспроизводимая-пример/5963 610). Это облегчит вам помощь другим людям. – Jaap

+1

Кроме того, вы можете начать читать этот вопрос: «Как объединить (слияние) кадры данных (внутренний, внешний, левый, правый)?] (Http://stackoverflow.com/questions/1299871/how-to-join-merge -data-frames-inner-outer-left-right) – Jaap

+0

Эй, я прочитал все вопросы о присоединении и объединении Q & As и не смог найти ответ. – Squeezie

ответ

1

Другой подход с очистки и слияния (левое соединение) (вероятно, гораздо менее эффективны, чем @Pierre ответ):

A <- structure(list(id = 1:4), .Names = "id", row.names = c(NA, -4L), class = "data.frame") 
B <- structure(list(id = c("1", "2", "2", "4", "5"), val = c("X", "Y", "Z", "Z", "ZZ")), .Names = c("id", "val"), row.names = c(NA, 5L), class = "data.frame") 

# Cleanup duplicated id in B (could be used in the merge to avoid creating a new object, done here for ease of reading) 
NB <- B[!B$id %in% B$id[duplicated(B$id)],] 

# left merge of A and B on id 
merge(A,NB,all.x=TRUE,by="id") 

Дает:

id val 
1 1 X 
2 2 <NA> 
3 3 <NA> 
4 4 Z 
+0

Эй, я редактировал мой вопрос. это может случиться, что B больше, чем A, тогда я думаю, что мы не можем использовать ур ответ. – Squeezie

+0

@Squeezie, вы ошибаетесь. с отредактированными данными он по-прежнему дает 4 строки (I.e: такое же количество строк, что и A) – Tensibai

+0

Он отлично справился с этой задачей. Спасибо! – Squeezie

2

Вы упомянули данные временного ряда в своем вопросе. Этот тип данных может поступать в общий формат таблицы или конкретный объект R ts. Класс ts является специальным типом векторных или матричных заданных специальных свойств для помощи в анализе временных рядов. Мы предположим для этого подхода, что у вас есть последний случай, объект class(A) [1] "data.frame".

Это меньше слияние, чем условное совпадение. Мы можем проверить, если есть один и только один матч из A значений в B:

indx <- sapply(A$col1, function(x) sum(B$col1 %in% x) == 1L) 
data.frame(v1=A$col1, v2=ifelse(indx, B$col2, NaN), stringsAsFactors=FALSE) 
# v1 v2 
# 1 1 X 
# 2 2 NaN 
# 3 3 NaN 
# 4 4 Z 

Примечание: Убедитесь, что не попасть в ловушку factor. R автоматически кодирует значения символов в класс factor не в класс character, как вы могли бы ожидать вначале. Чтобы избежать этой проблемы использовать stringsAsFactors=FALSE,

#Data 
A <- data.frame(col1=1:4L) 
B <- data.frame(col1=c(1,2,2,4), col2=c("X", "Y", "Z", "Z"), stringsAsFactors=FALSE)