কীভাবে কোনও আর-তে কোনও ডাটা ফ্রেমে একটি সারি যুক্ত করতে পারে?


129

আর-তে, ডেটা ফ্রেমটি ইতিমধ্যে শুরু হয়ে গেলে আপনি কীভাবে একটি ডেটা ফ্রেমে একটি নতুন সারি যুক্ত করবেন?

এখনও পর্যন্ত আমার কাছে এটি রয়েছে:

df <- data.frame("hi", "bye")
names(df) <- c("hello", "goodbye")

#I am trying to add "hola" and "ciao" as a new row
de <- data.frame("hola", "ciao")

merge(df, de) # Adds to the same row as new columns

# Unfortunately, I couldn't find an rbind() solution that wouldn't give me an error

কোন সাহায্য প্রশংসা করা হবে


1
নামও বরাদ্দ করুন denames(de) <- c("hello","goodbye")এবংrbind
খাসা

3
বা এক লাইনেrbind(df, setNames(de, names(df)))
ধনী স্ক্রিভেন

2
এই সত্যিই একটি এলাকা যা বেস আর এ শোচনীয়ভাবে ব্যর্থ হয়, এবং একটি দীর্ঘ সময়ের জন্য আছে: stackoverflow.com/questions/13599197/...
thelatemail

1
নিবন্ধ ডেটা ফ্রেমগুলি r এর একটি বিশেষ কাঠামো। সাধারণ নাম এবং বৈশিষ্ট্য এবং পদ্ধতি সহ তালিকাগুলির একটি তালিকা। আমার মনে হয় খুব আশা করা যায় যে কেউ পারবেনা rbind(data.frame(a = 1), data.frame(b = 2)).. আপনি কেন চাইবেন? আমি আশা করি এটি নির্বিশেষে ত্রুটি ছুঁড়ে ফেলবে। এটি merge'এলোমেলো byভেরিয়েবলের সাথে যুক্ত হওয়ার মতো । এবং এটি 2015, সবাই সেট করে না options(stringsAsFactors = FALSE)?
কাঁচা

1
@ আরআর - অবশ্যই, বিভিন্ন নাম আবদ্ধ করা উচিত নয়, তবে আর কোনও নামের সাথে কোনও নাম বাঁধাই, একই মাত্রার সাথে কোনও নামের নাম আবদ্ধ করতে বা নতুন ফ্যাক্টরের স্তরগুলিকে অন্তর্ভুক্ত করতে নতুন ডেটা বাঁধাই করতে পারে না। আমি মনে করি এটি একটি দুর্বলতা। বিশেষত যখন এটি বাধ্যতামূলক পুনরাবৃত্ত নাম এবং সমস্ত এনএ নামগুলি পরিচালনা করতে পারে। এবং সেটিং stringsAsFactors=FALSEদ্রুত সমাধান হতে পারে তবে অন্যান্য লোকেরা যে ডিফল্টগুলি আলাদাভাবে সেট করতে চলেছে তা পরিবর্তন একটি দিনকেই ধ্বংস করতে পারে।
thelatemail

উত্তর:


131

@ খশা এবং @ রিচার্ড স্ক্রিভেনের মতামতগুলিতে মন্তব্য করুন, আপনি যে সমস্ত ডেটা ফ্রেম যুক্ত করতে চান তার জন্য আপনাকে ধারাবাহিক কলামের নাম নির্ধারণ করতে হবে।

অতএব, আপনাকে দ্বিতীয় ডেটা ফ্রেমের কলামের নামগুলি স্পষ্টভাবে ঘোষণা করতে হবে de, তারপরে ব্যবহার করুন rbind()। আপনি কেবলমাত্র প্রথম ডেটা ফ্রেমের জন্য কলামের নাম সেট করেছেন df:

df<-data.frame("hi","bye")
names(df)<-c("hello","goodbye")

de<-data.frame("hola","ciao")
names(de)<-c("hello","goodbye")

newdf <- rbind(df, de)

ধন্যবাদ! আমি যদি দ্বিতীয় ডাটাফ্রেম ঘোষণা না করি তবে এটি কীভাবে ঠিক করা যায় তার কোনও ধারণা, তবে পরিবর্তে প্রতিটি মান আমি ভেরিয়েবল হিসাবে সঞ্চিত একটি নতুন সারিতে যুক্ত করতে চাই?
Rilcon42

8
চেষ্টা করুন: newdf<-rbind(df, data.frame(hello="hola", goodbye="ciao"))অথবা পরিবর্তনশীল সহ:newdf<-rbind(df, data.frame(hello=var1, goodbye=var2))
পারফাইট

108

আসুন এটি সহজ করুন:

df[nrow(df) + 1,] = c("v1","v2")

9
মিশ্রিত ডেটা জাতীয় ধরণের (কিছু স্ট্রিং, কিছু সংখ্যাসূচক) নতুন সারি যুক্ত করার চেষ্টা করার সময় এটি সমস্যার সৃষ্টি করে। এই জাতীয় ক্ষেত্রে, এমনকি সংখ্যাসূচক মানগুলি স্ট্রিংয়ে রূপান্তরিত হয়। একটি কার্যপ্রণালী হ'ল মানগুলি আলাদাভাবে যুক্ত করা, নিম্নলিখিতগুলির মতো কিছু (3 টি কলাম রয়েছে বলে ধরে নেওয়া): df[nrow(df) + 1, 1:2] = c("v1", "v2")এবং df[nrow(df), 3] = 100তবুও এটি নতুন সারি যুক্ত করার পক্ষে একটি ভাল বিষয়। সুতরাং, +1
দ্য স্টুডেন্ট সোল 8 ই

17
অথবা "সি" এর পরিবর্তে "তালিকা" ব্যবহার করুন।
ইয়েটসন ডি বোয়ার

সুন্দর ধারণা, তবে আমি কী করতে পারি যদি আমি একটি নতুন সারিটি প্রথম অবস্থানে প্রবেশ করতে বা যুক্ত করতে চাই?
ডারউইন পিসি

1
ডেটা.টিটেবল দিয়ে এটি ব্যবহার করে চেষ্টা করা কিন্তু নরো +1 এর সাথে বলার অপেক্ষা রাখে না।
হারমান টুথরট

1
@ অরণী এর সাথে ইতিমধ্যে একটি উত্তর রয়েছে list()। আমি আপনার সম্পাদনাটি ফিরিয়ে দিয়েছি।
এম--

41

বা, যেমন ম্যাথিউস আরাউজো দ্বারা অনুপ্রাণিত:

df[nrow(df) + 1,] = list("v1","v2")

এটি মিশ্রিত ডেটা ধরণের জন্য অনুমতি দেয়।


24

বা প্যাকেজগুলি add_row()থেকে এখন আছে ।tibbletidyverse

library(tidyverse)
df %>% add_row(hello = "hola", goodbye = "ciao")

অনির্ধারিত কলামগুলি একটি পায় NA


আপনি যদি পরিপাটি দর্শনের প্রতি দৃ stick় থাকেন তবে আমার এই পদ্ধতির পছন্দ হয়েছে। অন্যথায় বেসিক আর সিনট্যাক্স একটি বেঁচে থাকার দক্ষতা যা আপনি যখন এমন পরিবেশে থাকবেন যেখানে প্যাকেজগুলি আমদানির সুযোগ নেই। আমি বিশেষত উত্তর নীচেrbind এবং as.matrix নীচে
পাবলো অ্যাডামস

17

আমি এর listপরিবর্তে পছন্দ করি cকারণ এটি মিশ্র ডেটা প্রকারগুলি আরও ভালভাবে পরিচালনা করে। মূল পোস্টারের প্রশ্নের অতিরিক্ত কলাম যুক্ত করা:

#Create an empty data frame
df <- data.frame(hello=character(), goodbye=character(), volume=double())
de <- list(hello="hi", goodbye="bye", volume=3.0)
df = rbind(df,de, stringsAsFactors=FALSE)
de <- list(hello="hola", goodbye="ciao", volume=13.1)
df = rbind(df,de, stringsAsFactors=FALSE)

নোট করুন যে স্ট্রিং / ফ্যাক্টর রূপান্তরটি গুরুত্বপূর্ণ হলে কিছু অতিরিক্ত নিয়ন্ত্রণের প্রয়োজন।

অথবা ম্যাথিউস আরাজো / ইটসেন ডি বোয়ারের সমাধান সহ মূল ভেরিয়েবলগুলি ব্যবহার করে:

df[nrow(df) + 1,] = list(hello="hallo",goodbye="auf wiedersehen", volume=20.2)

মনে রাখবেন যে ডেটাফ্রেমে বিদ্যমান ডেটা না থাকলে এই সমাধানটি স্ট্রিংগুলির সাথে ভালভাবে কাজ করে না।


যদি helloএবং goodbyeচরিত্রে থাকে তবে আপনি dfনিম্নলিখিতটি করতে পারেন। অগত্যা আপনি তালিকায় নাম ব্যবহার করবেন না। df <- data.frame(hello = "hi", goodbye = "bye", volume = 1,stringsAsFactors = FALSE); rbind(df, list("hola", "ciao", 100))
জাজুরুর

11

ভয়ানক মার্জিত নয়, তবে:

data.frame(rbind(as.matrix(df), as.matrix(de)))

rbindফাংশনের ডকুমেন্টেশন থেকে :

জন্য rbindকলাম নামে উপযুক্ত নামের সাথে প্রথম আর্গুমেন্ট থেকে নেয়া হয়: একটি ম্যাট্রিক্স জন্য colnames ...


এই সমাধানটি যুক্ত করার জন্য কলামগুলি নির্দিষ্ট করার প্রয়োজন ছাড়াই কাজ করে যা বড় ডেটাসেটের অ্যাপ্লিকেশনগুলির জন্য অনেক ভাল
ফিলিপ

1

আমি যোগ করতে হবে stringsAsFactors=FALSEযখন dataframe তৈরি করা।

> df <- data.frame("hello"= character(0), "goodbye"=character(0))
> df
[1] hello   goodbye
<0 rows> (or 0-length row.names)
> df[nrow(df) + 1,] = list("hi","bye")
Warning messages:
1: In `[<-.factor`(`*tmp*`, iseq, value = "hi") :
  invalid factor level, NA generated
2: In `[<-.factor`(`*tmp*`, iseq, value = "bye") :
  invalid factor level, NA generated
> df
  hello goodbye
1  <NA>    <NA>
> 

> df <- data.frame("hello"= character(0), "goodbye"=character(0), stringsAsFactors=FALSE)
> df
[1] hello   goodbye
<0 rows> (or 0-length row.names)
> df[nrow(df) + 1,] = list("hi","bye")
> df[nrow(df) + 1,] = list("hola","ciao")
> df[nrow(df) + 1,] = list(hello="hallo",goodbye="auf wiedersehen")
> df
  hello         goodbye
1    hi             bye
2  hola            ciao
3 hallo auf wiedersehen
> 

1

stringsAsFactors=FALSEডেটা ফ্রেম তৈরি করার সময় নির্দিষ্ট করে নির্দিষ্ট করুন :

> rm(list=ls())
> trigonometry <- data.frame(character(0), numeric(0), stringsAsFactors=FALSE)
> colnames(trigonometry) <- c("theta", "sin.theta")
> trigonometry
[1] theta     sin.theta
<0 rows> (or 0-length row.names)
> trigonometry[nrow(trigonometry) + 1, ] <- c("0", sin(0))
> trigonometry[nrow(trigonometry) + 1, ] <- c("pi/2", sin(pi/2))
> trigonometry
  theta sin.theta
1     0         0
2  pi/2         1
> typeof(trigonometry)
[1] "list"
> class(trigonometry)
[1] "data.frame"

stringsAsFactors=FALSEডেটাফ্রেম তৈরি করার সময় ব্যবহার করতে ব্যর্থ হলে নতুন সারি যুক্ত করার চেষ্টা করার সময় নিম্নলিখিত ত্রুটির ফলাফল ঘটবে:

> trigonometry[nrow(trigonometry) + 1, ] <- c("0", sin(0))
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "0") :
  invalid factor level, NA generated

0

যদি আপনি জানেন যে দুটি ডেটাফ্রেম একই কলাম এবং প্রকারগুলি ভাগ করে দেয় তবে একটি ডাটাফ্রেম থেকে অন্য ডেটা ফ্রেমে রেকর্ড সংযোজনের একটি সহজ উপায় রয়েছে। থেকে এক সারি সংযোজন করতে xxকরতে yyএখনই অনুসরণ যেখানে না iহয় i'থেকে তম সারি xx

yy[nrow(yy)+1,] <- xx[i,]

যে হিসাবে সহজ। কোন অগোছালো বাঁধা নেই। তোমরা সবাই যোগ করার প্রয়োজন হলে xxকরতে yy, তারপর পারেন একটি লুপ কল বা R এর ক্রম ক্ষমতার সদ্ব্যবহার করা এবং এই কাজ:

zz[(nrow(zz)+1):(nrow(zz)+nrow(yy)),] <- yy[1:nrow(yy),]

0

আপনি যদি একটি খালি ডেটা ফ্রেম তৈরি করতে চান এবং একটি লুপে বিষয়বস্তু যুক্ত করতে চান তবে নিম্নলিখিতগুলি সহায়তা করতে পারে:

# Number of students in class
student.count <- 36

# Gather data about the students
student.age <- sample(14:17, size = student.count, replace = TRUE)
student.gender <- sample(c('male', 'female'), size = student.count, replace = TRUE)
student.marks <- sample(46:97, size = student.count, replace = TRUE)

# Create empty data frame
student.data <- data.frame()

# Populate the data frame using a for loop
for (i in 1 : student.count) {
    # Get the row data
    age <- student.age[i]
    gender <- student.gender[i]
    marks <- student.marks[i]

    # Populate the row
    new.row <- data.frame(age = age, gender = gender, marks = marks)

    # Add the row
    student.data <- rbind(student.data, new.row)
}

# Print the data frame
student.data

আশা করি এটা সাহায্য করবে :)

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