2016-06-25 4 views
0

Я пытаюсь объединить два кадра данных с различными измерениями, но просто не могу получить результат, который я получаю. Вот пример того, что я пытаюсь достичь:R: Объединение фреймов данных различной длины без значений утилизации

фрейма данных выглядит следующим образом:

id  value 
A   X 
A   Y 
A   Z 
B   Y 
C   X 
C   Z 

кадр данных B выглядит следующим образом:

id  value 
A   U 
A   W 
B   U 
B   W 
B   V 
C   V 

И фрейм данных I» м пытается создать внешний вид, как:

id  value.A  value.B 
A   X    U 
A   Y    W 
A   Z    NA 
B   Y    U 
B   NA    W 
B   NA    V 
C   X    V 
C   Z    NA 

Я пытался объединить кадры данных с базой merge, но продолжайте получать повторяющиеся значения вместо NA. Он также, кажется, расширяет результирующий фрейм данных, чтобы обеспечить уникальные комбинации value.A и value.B, которые мне также не интересны. Наконец, не все идентификаторы в кадре данных B имеют соответствующий ID в кадре данных A, и в этом случае I хотел бы value.B быть NA для этого удостоверения личности.

Есть ли способ достичь того, что я ищу, с merge или я ищу другой (набор) команд (-ов)?

Edit:

Просто чтобы прояснить, я сделал попробовать различные комбинации соединений, но до сих пор не нашли решения.

Пример:

A <- data.frame(id = c("A", "A", "A", "B", "C", "C"), 
       value = c("X", "Y", "Z", "Y", "X", "Z")) 

B <- data.frame(id = c("A", "A", "B", "B", "B", "C"), 
       value = c("U", "W", "U", "W", "V", "V")) 

merge(A, B, by="id", all=TRUE) 

Производит:

id value.x value.y 
A  X   U 
A  X   W 
A  Y   U 
A  Y   W 
A  Z   U 
A  Z   W 
B  Y   U 
B  Y   W 
B  Y   V 
C  X   V 
C  Z   V 

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

Редактирование 2: Похоже, я слишком упростил свой первоначальный пример, поэтому просто для того, чтобы уточнить, почему порядок моих значений имеет значение, мне придется расширить исходный пример немного:

фрейм данных выглядит следующим образом:

id  value  rank 
A   X   1 
A   Y   0.5 
A   Z   0.2 
B   Y   1 
C   X   1 
C   Z   0.8 

кадр данных B выглядит следующим образом:

id  value  rank 
A   U   1 
A   W   0.6 
B   U   1 
B   W   0.2 
B   V   0.1 
C   V   1 

И намеченная кадр данных выглядит следующим образом:

id  value.A  rank.A  value.B  rank.B 
A   X    1    U    1 
A   Y    0.5   W    0.6 
A   Z    0.2   NA    NA 
B   Y    1    U    1 
B   NA    NA   W    0.2 
B   NA    NA   V    0.1 
C   X    1    V    1 
C   Z    0.8   NA    NA 
+0

Я думаю, что это не на самом деле данные проблема кадров. Поскольку порядок U и W, соответствующий X, Y и Z, не определен, он может быть случайным. Может быть, лучше использовать список. – Psidom

+2

Я думаю об этом как о причудливой версии 'cbind', где порядок двух наборов данных правильный, но один короче другого. Цель состоит в основном в том, чтобы группировать группы, где количество наблюдений по группе не обязательно должно совпадать. Это правда @ageil? – lmo

+0

@Psidom Да, я полагаю, вы правы, порядок моих значений на самом деле случайен здесь. Однако в моем реальном наборе данных значения фактически привязаны к третьему числовому значению переменной X по Y для A в кадре данных A. Мне, вероятно, следует снова пересмотреть вопрос, чтобы это отразить, спасибо. – ageil

ответ

0

Вам нужен аргумент «all» в функции слияния.

merge(a, b, all = TRUE) 
+0

Я отредактировал этот вопрос, чтобы уточнить проблему. К сожалению, 'all = TRUE', похоже, не производит то, что я ищу. – ageil

1

вот моя фантазия cbind.Я создаю вторичные идентификаторы, которые предполагают, что данные упорядочены с соответствующими рядами и df2 может закончиться до пеленгации для каждого ID:

# add secondary IDs 
df$idCnt <- rep_len(1L, length=nrow(df)) 
df$idCnt <- ave(df$idCnt, df$id, FUN=cumsum) 

df2$idCnt <- rep_len(1L, length=nrow(df2)) 
df2$idCnt <- ave(df2$idCnt, df2$id, FUN=cumsum) 

merge(df, df2, by=c("id", "idCnt"), all=TRUE) 
id idCnt value.x value.y 
1 A  1  X  U 
2 A  2  Y  W 
3 A  3  Z <NA> 
4 B  1  Y  U 
5 B  2 <NA>  W 
6 B  3 <NA>  V 
7 C  1  X  V 
8 C  2  Z <NA> 

Вот данные:

**data** 
df <- read.table(header=T, text="id  value 
A   X 
A   Y 
A   Z 
B   Y 
C   X 
C   Z", stringsAsFactors=F) 

df2 <- read.table(header=T, text="id  value 
A   U 
A   W 
B   U 
B   W 
B   V 
C   V", stringsAsFactors=F) 
Смежные вопросы