दिलचस्प पोस्ट
पायथन में सही गतिशील और गुमनाम कार्य संभव है? IOS 6 में UIActivityViewController के लिए प्राप्तकर्ता कैसे सेट करूं? एक रेखा के निकटतम बिंदु प्राप्त करें जावास्क्रिप्ट / डीओएम: डॉम ऑब्जेक्ट की सभी घटनाओं को कैसे निकालना है? CSS3 रूपांतरण: घुमाएगी; IE9 में जावा में एक मूल स्वैप फ़ंक्शन कैसे लिखें अपने फाइल सिस्टम में छवियों को कैसे स्टोर करें HTML संरेखण समस्या केवल एक मशीन में (दोनों IE8) एक निश्चित समय के बाद एक MySQL रिकॉर्ड को कैसे हटाएं कार्यक्रम केवल रिलीज़ बिल्ड के रूप में क्रैश करता है – कैसे डीबग करें? प्राकृतिक सॉर्टिंग एल्गोरिथम सी + + में सुस्त मूल्यांकन क्या C ++ enum को स्ट्रिंग में बदलने का एक आसान तरीका है? सभी एंड्रॉइड संपर्क कैसे प्राप्त करें, लेकिन सिम पर हैं बिना एंड्रॉइड: अतिव्यापी मुद्दा टुकड़े

विभिन्न लंबाई के दो डेटा फ्रेम के संयोजन

मेरे पास दो डेटा फ्रेम हैं
पहला केवल एक स्तंभ और 10 पंक्तियों का है
दूसरा 3 कॉलम और 50 पंक्तियों का है।

जब मैं cbind का उपयोग करके इसे गठबंधन करने का प्रयास करता cbind , तो यह यह त्रुटि देता है:

Data.frame में त्रुटि (…, check.names = FALSE):

क्या कोई ऐसा करने के लिए किसी अन्य कार्य का सुझाव दे सकता है?
पी एस मैंने यह भी सूचियों का उपयोग करने की कोशिश की है, लेकिन यह एक ही त्रुटि देता है

3 कॉलम वाला डेटा फ्रेम, एक CSV फ़ाइल में पहले 3 कॉलम होना चाहिए, जबकि एक कॉलम के साथ डेटा फ्रेम उस फ़ाइल का चौथा स्तंभ होना चाहिए, जब मैं write.table फ़ंक्शन के साथ लिखता हूं। पहले 3 कॉलम में 50 पंक्तियाँ हैं और चौथे स्तंभ को पहले 10 पंक्तियों पर कब्जा करना चाहिए।

वेब के समाधान से एकत्रित समाधान "विभिन्न लंबाई के दो डेटा फ्रेम के संयोजन"

plyr पैकेज में एक फ़ंक्शन rbind.fill होता rbind.fill यह डेटा मर्ज करेगा और रिक्त कक्षों के लिए NA लागू करेगा:

 library(plyr) combined <- rbind.fill(mtcars[c("mpg", "wt")], mtcars[c("wt", "cyl")]) combined[25:40, ] mpg wt cyl 25 19.2 3.845 NA 26 27.3 1.935 NA 27 26.0 2.140 NA 28 30.4 1.513 NA 29 15.8 3.170 NA 30 19.7 2.770 NA 31 15.0 3.570 NA 32 21.4 2.780 NA 33 NA 2.620 6 34 NA 2.875 6 35 NA 2.320 4 

यह मेरे लिए स्पष्ट नहीं है कि ओपी वास्तव में क्या है, फॉलो-अप टिप्पणियों को देखते हुए। यह संभव है कि वह वास्तव में फाइल को डेटा लिखने का एक तरीका तलाश रहे हैं

लेकिन मान लीजिए कि हम वास्तव में अलग-अलग समय के कई डेटा फ़्रेमों को cbind करने के लिए हैं।

cbind अंततः data.frame , जिनकी सहायता फाइलें कहती हैं:

डेटा के लिए दिए गए ऑब्जेक्ट्स को समान पंक्तियों की संख्या होनी चाहिए, लेकिन यदि आवश्यक हो तो परमाणु वैक्टर, कारक और चरित्र वेक्टर को संरक्षित किया जाएगा, यदि आवश्यक हो तो (आर 2.9.0, सूची आर्गिमेंट के तत्वों सहित)।

इसलिए ओपी के वास्तविक उदाहरण में, कोई त्रुटि नहीं होनी चाहिए , क्योंकि आर को कम वैक्टर को 50 की लंबाई में रीसायकल करना चाहिए। वास्तव में, जब मैं निम्नलिखित चलाता हूं:

 set.seed(1) a <- runif(50) b <- 1:50 c <- rep(LETTERS[1:5],length.out = 50) dat1 <- data.frame(a,b,c) dat2 <- data.frame(d = runif(10),e = runif(10)) cbind(dat1,dat2) 

मुझे कोई गलती नहीं मिलती है और उम्मीद के मुताबिक छोटी डाटा फ़्रेम पुनर्नवीनीकरण होता है हालांकि, जब मैं इसे चलाता हूं:

 set.seed(1) a <- runif(50) b <- 1:50 c <- rep(LETTERS[1:5],length.out = 50) dat1 <- data.frame(a,b,c) dat2 <- data.frame(d = runif(9), e = runif(9)) cbind(dat1,dat2) 

मुझे निम्नलिखित त्रुटि मिलती है:

 Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 50, 9 

लेकिन आर के बारे में अच्छी बात यह है कि आप इसे लगभग कुछ भी करना चाहते हैं, भले ही आपको नहीं करना चाहिए। उदाहरण के लिए, यहां एक सरल कार्य है जो असमान लम्बाई के डेटा फ्रेम्स को cbind देगा और NA साथ छोटे लोगों को पैड करेगा:

 cbindPad <- function(...){ args <- list(...) n <- sapply(args,nrow) mx <- max(n) pad <- function(x, mx){ if (nrow(x) < mx){ nms <- colnames(x) padTemp <- matrix(NA, mx - nrow(x), ncol(x)) colnames(padTemp) <- nms if (ncol(x)==0) { return(padTemp) } else { return(rbind(x,padTemp)) } } else{ return(x) } } rs <- lapply(args,pad,mx) return(do.call(cbind,rs)) } 

जो इस तरह से इस्तेमाल किया जा सकता है:

 set.seed(1) a <- runif(50) b <- 1:50 c <- rep(LETTERS[1:5],length.out = 50) dat1 <- data.frame(a,b,c) dat2 <- data.frame(d = runif(10),e = runif(10)) dat3 <- data.frame(d = runif(9), e = runif(9)) cbindPad(dat1,dat2,dat3) 

मैं कोई गारंटी नहीं देता कि यह फ़ंक्शन सभी मामलों में काम करता है; इसका मतलब केवल एक उदाहरण के रूप में है

संपादित करें

यदि प्राथमिक लक्ष्य एक सीएसवी या पाठ फ़ाइल बनाना है, तो आपको यह करने के लिए फ़ंक्शन को पैड से NA बजाय "" बदलने की ज़रूरत है और फिर ऐसा कुछ करें:

 dat <- cbindPad(dat1,dat2,dat3) rs <- as.data.frame(apply(dat,1,function(x){paste(as.character(x),collapse=",")})) 

और फिर write.table पर write.table उपयोग करें

एंड्री के जवाब पर चर्चा करते हुए, plyr::rbind.fill() का उपयोग करने के सुझाव: t() आपके पास कुछ cbind.fill() (जो कि plyr हिस्सा नहीं है) है, जो समान डेटा के विचार के साथ आपके डेटा फ्रेम का निर्माण करेगा संख्या।

मुझे इसके साथ वास्तव में कोई त्रुटि नहीं मिली है

 a <- as.data.frame(matrix(c(sample(letters,50, replace=T),runif(100)), nrow=50)) b <- sample(letters,10, replace=T) c <- cbind(a,b) 

सभी अक्षरों में शामिल होने के लिए मैंने अलग-अलग कार्यशीलता वाले पत्रों का उपयोग किया था (जो इसे नहीं था)। आपकी 'प्रथम डेटा फ्रेम', जो वास्तव में केवल एक सदिश है, उस चौथे स्तंभ में 5 बार दोबारा दोहराई गई है …

लेकिन गुरु से सवाल सभी टिप्पणियां अब भी प्रासंगिक हैं 🙂

मुझे लगता है कि मैं एक बहुत कम समाधान के साथ आया हूँ .. उम्मीद है कि किसी को मदद मिलती है

 cbind.na<-function(df1, df2){ #Collect all unique rownames total.rownames<-union(x = rownames(x = df1),y = rownames(x=df2)) #Create a new dataframe with rownames df<-data.frame(row.names = total.rownames) #Get absent rownames for both of the dataframe absent.names.1<-setdiff(x = rownames(df1),y = rownames(df)) absent.names.2<-setdiff(x = rownames(df2),y = rownames(df)) #Fill absents with NAs df1.fixed<-data.frame(row.names = absent.names.1,matrix(data = NA,nrow = length(absent.names.1),ncol=ncol(df1))) colnames(df1.fixed)<-colnames(df1) df1<-rbind(df1,df1.fixed) df2.fixed<-data.frame(row.names = absent.names.2,matrix(data = NA,nrow = length(absent.names.2),ncol=ncol(df2))) colnames(df2.fixed)<-colnames(df2) df2<-rbind(df2,df2.fixed) #Finally cbind into new dataframe df<-cbind(df,df1[rownames(df),],df2[rownames(df),]) return(df) } 

मेरा विचार है कि सभी डेटा की अधिकतम पंक्तियों की गणना करना। फ्रेम और अगले रिक्त मैट्रिक्स को प्रत्येक डेटा में जोड़ें। फ़्रेम यदि ज़रूरत हो इस विधि को अतिरिक्त संकुल की आवश्यकता नहीं है, केवल आधार का उपयोग किया जाता है। कोड निम्नलिखित दिखता है:

 list.df <- list(data.frame(a = 1:10), data.frame(a = 1:5), data.frame(a = 1:3)) max.rows <- max(unlist(lapply(list.df, nrow), use.names = F)) list.df <- lapply(list.df, function(x) { na.count <- max.rows - nrow(x) if (na.count > 0L) { na.dm <- matrix(NA, na.count, ncol(x)) colnames(na.dm) <- colnames(x) rbind(x, na.dm) } else { x } }) do.call(cbind, list.df) # aaa # 1 1 1 1 # 2 2 2 2 # 3 3 3 3 # 4 4 4 NA # 5 5 5 NA # 6 6 NA NA # 7 7 NA NA # 8 8 NA NA # 9 9 NA NA # 10 10 NA NA 

बस मेरे 2 सेंट यह कोड दो मैट्रिक्स या डेटा। फ्रेम को एक में जोड़ता है। यदि एक डेटा संरचना में पंक्तियों की संख्या कम है तो एनए वैल्यू के साथ पंक्तियां गायब हो जाएंगी।

 combine.df <- function(x, y) { rows.x <- nrow(x) rows.y <- nrow(y) if (rows.x > rows.y) { diff <- rows.x - rows.y df.na <- matrix(NA, diff, ncol(y)) colnames(df.na) <- colnames(y) cbind(x, rbind(y, df.na)) } else { diff <- rows.y - rows.x df.na <- matrix(NA, diff, ncol(x)) colnames(df.na) <- colnames(x) cbind(rbind(x, df.na), y) } } df1 <- data.frame(1:10, row.names = 1:10) df2 <- data.frame(1:5, row.names = 10:14) combine.df(df1, df2) 

आशा है कि यह आपके लिए काम करेगा!

आप असमान आकार के साथ दो मैट्रिक्स के संयोजन के लिए library(qpcR) उपयोग कर सकते हैं।

 resultant_matrix <- qpcR:::cbind.na(matrix1, matrix2) 

नोट: – परिणामस्वरूप मैट्रिक्स मैट्रिक्स 2 के आकार का होगा।

मुझे भी इसी तरह की समस्या थी, मैंने दो डेटा सेटों के किसी विशेष कॉलम में प्रविष्टियों का मिलान किया और केवल तभी सीधा किया जब यह मेल खाती हो। दो डेटा सेटों के लिए, डेटा 1 और डेटा 2, मैं डेटा 2 में डेटा 1 में एक कॉलम जोड़ रहा हूं, जो कि दोनों के पहले कॉलम की तुलना करते हैं।

 for(i in 1:nrow(data1){ for( j in 1:nrow(data2){ if (data1[i,1]==data2[j,1]) data1[i,3]<- data2[j,2] } }