R में डेटा फ़्रेम में एक पंक्ति कैसे जोड़ सकते हैं?


129

R में, डेटा फ़्रेम को पहले से प्रारंभ करने के बाद आप डेटा फ़्रेम में एक नई पंक्ति कैसे जोड़ सकते हैं?

अब तक मेरे पास यह है:

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
नामों को deभी असाइन करें । names(de) <- c("hello","goodbye")औरrbind
खाशा

3
या एक पंक्ति मेंrbind(df, setNames(de, names(df)))
रिच स्क्रीवेन

2
यह वास्तव में एक ऐसा क्षेत्र है जिसका आधार R बुरी तरह से विफल रहता है, और लंबे समय से है: stackoverflow.com/questions/13599197/…
thelatemail

1
@thelatemail असहमत। डेटा फ्रेम r में एक विशेष संरचना है। सामान्य डिमनाम और विशेषताओं और विधियों के साथ सूचियों की एक सूची। मुझे लगता है कि यह बहुत उम्मीद है कि कोई नहीं कर सकता है rbind(data.frame(a = 1), data.frame(b = 2)).. आप क्यों चाहते हैं? मुझे उम्मीद है कि एक त्रुटि की परवाह किए बिना फेंक देंगे। यह mergeएक यादृच्छिक byचर के साथ 'आईएनजी की तरह है । और यह 2015 है, हर कोई सेट नहीं करता है options(stringsAsFactors = FALSE)?
rawr

1
@ क्रॉल - निश्चित रूप से, अलग-अलग नामों को बाध्य नहीं किया जाना चाहिए, लेकिन आर किसी भी नाम को बिना किसी नाम के बाध्यकारी नहीं कर सकता, समान आयामों के साथ कोई नाम नहीं बांध सकता है, या नए कारक स्तरों को शामिल करने के लिए नए डेटा को बाध्य कर सकता है। मुझे लगता है कि यह एक कमजोरी है। विशेष रूप से जब यह बाध्यकारी दोहराए गए नामों और सभी NA नामों को संभाल सकता है। और सेटिंग stringsAsFactors=FALSEजल्दी ठीक हो सकती है, लेकिन अन्य लोगों को अलग-अलग सेट किए जाने वाले चूक को बदलना वास्तव में एक दिन को बर्बाद कर सकता है।
Thelatemail

जवाबों:


131

जैसे @Khahaa और @Richard Scriven टिप्पणियों में बताते हैं, आपको उन सभी डेटा फ़्रेमों के लिए लगातार कॉलम नाम सेट करना होगा जिन्हें आप जोड़ना चाहते हैं।

इसलिए, आपको दूसरे डेटा फ़्रेम के लिए कॉलम नामों को स्पष्ट रूप से घोषित करने की आवश्यकता है 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))
Parfait

109

आइए इसे सरल बनाएं:

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

10
मिश्रित डेटा प्रकार (कुछ स्ट्रिंग, कुछ संख्यात्मक) के साथ एक नई पंक्ति को जोड़ने की कोशिश करते समय यह समस्याएं पैदा करता है। ऐसे मामले में, संख्यात्मक मान भी स्ट्रिंग में बदल जाते हैं। एक वर्कअराउंड मानों को अलग-अलग जोड़ने के लिए है, निम्न की तरह कुछ (मान लें कि 3 कॉलम हैं): df[nrow(df) + 1, 1:2] = c("v1", "v2")और df[nrow(df), 3] = 100फिर भी यह नई पंक्ति को जोड़ने के बारे में एक अच्छा बिंदु है। तो, +1
द स्टूडेंट सोल

17
या "सी" के बजाय "सूची" का उपयोग करें।
यत्सेन डी बोअर

अच्छा विचार है, लेकिन अगर मैं पहली पंक्ति में नई पंक्ति सम्मिलित करना या जोड़ना चाहता हूं तो मैं कैसे कर सकता हूं?
डार्विन पीसी

1
Data.table के साथ यह करने की कोशिश की, लेकिन nrow + 1 के साथ बताता है कि सीमा से बाहर है।
हरमन टूथ्रोट

1
@ अरणी पहले से ही एक जवाब है list()। मैंने आपका संपादन वापस कर दिया है।
22


24

वहाँ अब add_row()से tibbleया tidyverseसंकुल।

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

अनिर्दिष्ट कॉलम एक प्राप्त करते हैं NA


यदि आप समसामयिक दर्शन से चिपके रहते हैं तो मुझे यह दृष्टिकोण पसंद आया। अन्यथा बेसिक आर सिंटैक्स एक अस्तित्व कौशल है जो तब आता है जब आप एक ऐसे वातावरण में होते हैं जहां आपके पास पैकेज आयात करने के लिए विशेषाधिकार नहीं होते हैं। मुझे विशेष रूप से सादे आर सिंटैक्स के साथ 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)

ध्यान दें कि यदि स्ट्रिंग / कारक रूपांतरण महत्वपूर्ण है, तो कुछ अतिरिक्त नियंत्रण की आवश्यकता होती है।

या MatheusAraujo / Ytsen de Boer से समाधान के साथ मूल चर का उपयोग करना:

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 ...


यह समाधान जोड़ने के लिए स्तंभों को निर्दिष्ट करने की आवश्यकता के बिना काम करता है, जो बड़े डेटासेट पर अनुप्रयोगों के लिए बहुत बेहतर है
Phil_T

1

मुझे stringsAsFactors=FALSEडेटाफ्रेम बनाते समय जोड़ना होगा ।

> 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है, तो या तो एक पाश पर कॉल करें या आर के अनुक्रम क्षमताओं का लाभ उठाने और ऐसा करते हैं:

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

आशा करता हूँ की ये काम करेगा :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.