আর - দুটি ডেটাফ্র্যাম কনটেনেট?


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
বোর্ন

34

পাতলা প্যাকেজ চেষ্টা করুন :

rbind.fill(a,b,c)

9
সাধারণ কাজের জন্য বাহ্যিক প্যাকেজগুলি ব্যবহার করা এড়িয়ে চলুন।
ফার্নান্দো

23
কেবল 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.