2013-09-14 1 views
0

Предположим, у вас есть два набора данных, x и y:Объединение dataframes колоннами, где существуют некоторые столбцы в обоих набора данных, но некоторые не

x=matrix(c(1,2,55,3,2,1,0,NA,NA,3,NA,333,NA,9,NA),5,3) 
colnames(x)=c(1133131,12442141,20100063) 
rownames(x)=c(1,2,3,4,5) 

y=matrix(c(8,1,3,41,131,NA,4141,NA,124,NA,213,NA,128,NA,2,NA,1241,2),3,6) 
colnames(y)=c(1133131,2422342,555555,33323242,20100063,23325600009) 
rownames(y)=c(6,7,8) 

Я хочу, чтобы объединить их так, что все столбцы присутствуют в конечном наборе данных , и данные заполняются там, где они существуют, и NA, где это не так. Поэтому, если он отсутствует в другом наборе данных, я хочу, чтобы все его значения были NA для этой части.

Поэтому в основном я хочу, чтобы конечный результат будет:

merged:  upc 
    days 1133131, 12442141, 2422342, 555555, 33323242, 20100063, 23325600009 
     1   1   1  NA 
     2   2   0  NA 
     3   55  NA  NA 
     4   3  NA  NA   ...etc 
     5   2   3  NA 
     6   8  NA  41 
     7   1  NA  131 
     8   3  NA  NA 
+0

Сначала решите, хотите ли вы объединить данные (например, в заголовке) или матрицах (из примера). – zero323

+1

Имена ростов различаются в 'x' и' y'; если это всегда произойдет в ваших наборах данных, решение будет проще, и на самом деле, возможно, лучше назвать «rbind» в R-lingo, а не «слиянием». Можете ли вы прояснить, будут ли эти розовые имена всегда отличаться? – Aaron

+0

Да, они всегда будут отличаться, но они будут иметь разную ширину, поэтому rbind (x, y) не будет обрабатывать таблицу. – robertevansanders

ответ

2

Вы можете использовать plyr.fill

library(plyr) 

# With matrices 
rbind.fill.matrix(x, y) 

# With dataframes 
rbind.fill(as.data.frame(x), as.data.frame(y)) 
+1

Это не то, что они ищут. Обратите внимание, что они являются желаемым выходом, имеет только одну строку, соответствующую дням = 1. – joran

+1

@joran На самом деле я не уверен. Мне кажется, что дни соответствуют именам розеток из входных данных. Значение 1 одно встречается дважды в столбце 1133131 на входе и в желаемом выходе. – zero323

+1

Я согласен с @ zero323, это похоже на то, что они хотят. Возможно, строки будут уникальными в 'x' и' y', но мое решение тоже. – Aaron

1

Вот base способ сделать это, просто сделав новую матрицу и заполнение это надлежащим образом. Это зависит от того, что строки уникальны в x и y.

cs <- sort(unique(c(colnames(x), colnames(y)))) 
rs <- c(rownames(x), rownames(y)) 
xy <- array(NA, dim=c(length(rs), length(cs)), dimnames=list(days=rs, upc=cs)) 
xy[1:nrow(x), colnames(x)] <- x 
xy[nrow(x) + 1:nrow(y), colnames(y)] <- y 
xy 
##  upc 
## days 1133131 12442141 20100063 23325600009 2422342 33323242 555555 
## 1  1  1  NA   NA  NA  NA  NA 
## 2  2  0  333   NA  NA  NA  NA 
## 3  55  NA  NA   NA  NA  NA  NA 
## 4  3  NA  9   NA  NA  NA  NA 
## 5  2  3  NA   NA  NA  NA  NA 
## 6  8  NA  128   NA  41  NA 4141 
## 7  1  NA  NA  1241  131  213  NA 
## 8  3  NA  2   2  NA  NA 124 
Смежные вопросы