आर - दो डेटाफ़्रेम कॉन्टेनेट करें?


129

दो डेटाफ्रेम aऔर दिए गए b:

> a
           a           b           c
1 -0.2246894 -1.48167912 -1.65099363
2  0.5559320 -0.87898575 -0.15634590
3  1.8469466 -0.01487524 -0.53098215
4 -0.6875051  0.23880967  0.01824621
5 -0.6735163  0.75485292  0.44154092


> b
           a          c
1  0.4287284 -0.3295925
2  0.5201492  0.3341251
3 -2.6355570  1.7916780
4 -1.3645337  1.3642276
5 -0.4954542 -0.6660001

क्या इनको संक्षिप्त करने का एक सरल तरीका है ताकि नीचे दिए गए फॉर्म का नया डेटा फ्रेम वापस किया जा सके?

> new
           a                   b           c
1  -0.2246894   -1.48167912106676 -1.65099363
2   0.5559320  -0.878985746842256 -0.15634590
3   1.8469466 -0.0148752354840942 -0.53098215
4  -0.6875051   0.238809666690982  0.01824621
5  -0.6735163   0.754852923524198  0.44154092
6   0.4287284                  NA -0.32959248
7   0.5201492                  NA  0.33412510
8  -2.6355570                  NA  1.79167801
9  -1.3645337                  NA  1.36422764
10 -0.4954542                  NA -0.66600006

मैं डेटाफ्रेम को मर्ज करना चाहता हूं, हेडर से मिलान करता हूं और डेटाफ्रेम NAमें उन पदों के लिए सम्मिलित करता हूं bजहां हेडर गायब है।


3
मुझे लगता है कि आप पहले से ही कोशिश कर चुके हैं merge()? वह काम क्यों नहीं करता है?
एंड्री

2
मैं एंड्री नहीं था - तो क्या आप मुझे गोह बनाने के लिए +1 करेंगे!
डैरेन जे। फिट्जपैट्रिक

16
मैं उलझन में हूं। डैरेन के ऑपरेशन में शामिल नहीं है - कोई "कार्टेसियन उत्पाद" नहीं है। बल्कि, यह एक सीधा निष्कर्ष है। तो कैसे जुड़ने में मदद मिलती है?
dfrankow

जवाबों:


225

आप "rbind" चाहते हैं।

b$b <- NA
new <- rbind(a, b)

rbind को समान कॉलम वाले डेटा फ़्रेम की आवश्यकता होती है।

पहली पंक्ति कॉलम बी को डेटा फ़्रेम बी में जोड़ती है।

परिणाम

> a <- data.frame(a=c(0,1,2), b=c(3,4,5), c=c(6,7,8))
> a
  a b c
1 0 3 6
2 1 4 7
3 2 5 8
> b <- data.frame(a=c(9,10,11), c=c(12,13,14))
> b
   a  c
1  9 12
2 10 13
3 11 14
> b$b <- NA
> b
   a  c  b
1  9 12 NA
2 10 13 NA
3 11 14 NA
> new <- rbind(a,b)
> new
   a  b  c
1  0  3  6
2  1  4  7
3  2  5  8
4  9 NA 12
5 10 NA 13
6 11 NA 14

9
यदि आपको 2 से अधिक डेटा फ़्रेम मिल रहे हैं, तो आप Reduce(rbind, list_of_data_frames)उन सभी को एक साथ मैश कर सकते हैं!
योरपाल

1
यदि आप rbindकिसी अजीब कारण के लिए आधार से आ रहे हैं : मैंने इस्तेमाल कियाrbind.data.frame
Boern

34

प्लाई पैकेज का प्रयास करें :

rbind.fill(a,b,c)

9
सरल कार्यों के लिए बाहरी पैकेज का उपयोग करने से बचें।
फर्नांडो

24
स्पष्ट और आसान अतिरिक्त कॉलम में हैकिंग से सिर्फ rbind को खुश करने के लिए; यह आगे बढ़ने का सही तरीका है। बेहद सामान्य पैकेज से बचना पसंद है plyrजब यह नौकरी के लिए सही उपकरण प्रदान करता है बस समझदार नहीं है।
जैक एडले

2
यह फ़ंक्शन स्वचालित रूप से कारक विलय करता है। यह स्वीकृत उत्तर की तुलना में काफी बेहतर है। plyrएक भयानक आम पैकेज है।
नमस्ते

23

आप फ़ंक्शन का उपयोग कर सकते हैं

bind_rows(a,b)

से dplyr पुस्तकालय


2
विपरीत cbind ( rbind), यह फ़ंक्शन सभी स्तंभों (पंक्तियों) के प्रकार को नहीं बदलता है factorयदि वर्णों का एक वेक्टर मौजूद है।
अज़ीम

11

यहां एक छोटा सा फ़ंक्शन है जो दो डेटासेट को ऑटो-डिटेक्ट करने के बाद एक साथ रिबंड करेगा जो प्रत्येक से गायब हैं और सभी के साथ उन्हें जोड़ रहे हैं NA

जो भी कारण के लिए यह फ़ंक्शन का उपयोग करने की तुलना में बड़े डेटासेट पर बहुत तेज़ी से लौटता है merge

fastmerge <- function(d1, d2) {
  d1.names <- names(d1)
  d2.names <- names(d2)

  # columns in d1 but not in d2
  d2.add <- setdiff(d1.names, d2.names)

  # columns in d2 but not in d1
  d1.add <- setdiff(d2.names, d1.names)

  # add blank columns to d2
  if(length(d2.add) > 0) {
    for(i in 1:length(d2.add)) {
      d2[d2.add[i]] <- NA
    }
  }

  # add blank columns to d1
  if(length(d1.add) > 0) {
    for(i in 1:length(d1.add)) {
      d1[d1.add[i]] <- NA
    }
  }

  return(rbind(d1, d2))
}

1
यह छोटा फ़ंक्शन डायनामाइट है।
डिर्क

अच्छा लगा। मैं बस एक ही उत्तर पोस्ट करना चाहता था :-)। एक सुधार: @Anton casted NAके लिए doubleअपने जवाब में। यह अच्छा होगा जब नए कॉलम का प्रकार अन्य डेटा फ्रेम में मौजूदा कॉलम की तरह ही होगा। शायद के माध्यम से mode(d2[d2.add[i]]) <- mode(d1[d2.add[i]])। लेकिन मुझे यकीन नहीं है कि क्या यह उचित तरीका है।
daniel.heydebreck

3

आप उपयोग कर सकते हैं rbindलेकिन इस मामले में आपको दोनों तालिकाओं में समान स्तंभों की आवश्यकता होगी, इसलिए निम्नलिखित प्रयास करें:

b$b<-as.double(NA) #keeping numeric format is essential for further calculations
new<-rbind(a,b)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.