2013-02-09 4 views
9

Я хотел бы merge несколько data.frame в R используя row.names, делая полное внешнее соединение. Для этого я надеялся сделать следующее:слить несколько данных.размер по строке в R

x = as.data.frame(t(data.frame(a=10, b=13, c=14))) 
y = as.data.frame(t(data.frame(a=1, b=2))) 
z = as.data.frame(t(data.frame(a=3, b=4, c=3, d=11))) 
res = Reduce(function(a,b) merge(a,b,by="row.names",all=T), list(x,y,z)) 

Warning message: 
In merge.data.frame(a, b, by = "row.names", all = T) : 
    column name ‘Row.names’ is duplicated in the result 
> res 
    Row.names Row.names V1.x V1.y V1 
    1   1   a 10 1 NA 
    2   2   b 13 2 NA 
    3   3   c 14 NA NA 
    4   a  <NA> NA NA 3 
    5   b  <NA> NA NA 4 
    6   c  <NA> NA NA 3 
    7   d  <NA> NA NA 11 

То, что я надеялся получить будет:

V1 V2 V3 
    a 10 1 3 
    b 13 2 4 
    c 14 NA 3 
    d NA NA 11 

ответ

6

следующие работы (до некоторого конечного переименования столбца):

res <- Reduce(function(a,b){ 
     ans <- merge(a,b,by="row.names",all=T) 
     row.names(ans) <- ans[,"Row.names"] 
     ans[,!names(ans) %in% "Row.names"] 
     }, list(x,y,z)) 

Действительно:

> res 
    V1.x V1.y V1 
a 10 1 3 
b 13 2 4 
c 14 NA 3 
d NA NA 11 

Что происходит со строкой соединения является то, что столбец с исходными rownames добавляется в ответ, что, в свою очередь, не содержит имен строк:

> merge(x,y,by="row.names",all=T) 
    Row.names V1.x V1.y 
1   a 10 1 
2   b 13 2 
3   c 14 NA 

Такое поведение описано в ?merge (по стоимости)

Если совпадение связано с именами строк, дополнительный столбец символов с именем Row.names добавляется слева, и во всех случаях в результате есть «автоматические» имена строк.

Когда Reduce пытается снова объединиться, он не находит никакого совпадения, если имена не будут очищены вручную.

2

Для непрерывности это не чистое решение, но обходной путь, я преобразую аргумент списка «Уменьшить», используя sapply.

Reduce(function(a,b) merge(a,b,by=0,all=T), 
         sapply(list(x,y,z),rbind))[,-c(1,2)] 
    x y.x y.y 
1 10 1 3 
2 13 2 4 
3 14 NA 3 
4 NA NA 11 
Warning message: 
In merge.data.frame(a, b, by = 0, all = T) : 
    column name ‘Row.names’ is duplicated in the result 
0

По какой-то причине у меня не было большого успеха с сокращением. учитывая список data.frames (df.lst) и список суффиксов (suff.lst), чтобы изменить имена одинаковых столбцов, это мое решение (это цикл, я знаю, что он уродливый по стандартам R, но он работает) :

df.merg <- as.data.frame(df.lst[1]) 
colnames(df.merg)[-1] <- paste(colnames(df.merg)[-1],suff.lst[[1]],sep="") 
for (i in 2:length(df.lst)) { 
    df.i <- as.data.frame(df.lst[i]) 
    colnames(df.i)[-1] <- paste(colnames(df.i)[-1],suff.lst[[i]],sep="") 
    df.merg <- merge(df.merg, df.i, by.x="",by.y="", all=T) 
} 

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

  • Нет связанных вопросов^_^