आर

2013-02-09 39 views
9

में पंक्ति द्वारा एकाधिक डेटा.फ्रेम मर्ज करें I mergerow.names का उपयोग करके row.names का उपयोग करके पूर्ण बाहरी जुड़ना चाहते हैं। इसके लिए मुझे क्या करना उम्मीद थी निम्नलिखित:आर

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 में प्रलेखित है

यदि मिलान पंक्ति नाम शामिल है, तो नामक एक अतिरिक्त वर्ण कॉलम बाईं ओर जोड़ा गया है, और सभी मामलों में परिणाम 'स्वचालित' पंक्ति नाम है।

जब 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) की एक सूची दी गई है, यह मेरा समाधान है (यह लूप है, मुझे पता है कि यह आर मानकों के लिए बदसूरत है, लेकिन यह काम करता है) :

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) 
}