2012-02-11 14 views
5

गुम होने पर डेटा फ्रेम में जोड़ें, मैं कुछ कोड लिखना चाहता हूं जो एक दिया गया डेटा फ्रेम लेगा, यह देखने के लिए जांचें कि कोई कॉलम गुम है या नहीं, और यदि ऐसा है, तो गुम कॉलम को भरें 0 या एनए। यहाँ मैं क्या कर लिया है: इस बिंदु से आगेआर: अनुपलब्ध कॉलम खोजें,

> df 
    x1 x2 x4 
1 0 1 3 
2 3 1 3 
3 1 2 1 

> nameslist <- c("x1","x2","x3","x4") 
> miss.names <- !nameslist %in% colnames(df) 
> holder <- rbind(nameslist,miss.names) 
> miss.cols <- subset(holder[1,], holder[2,] == "TRUE") 

, मैं इसे हार्डकोड बिना लापता स्तंभ ("x3") में शामिल करने का तरीका को समझ नहीं सकता। आदर्श रूप में, मैं नए, पूर्ण डेटा फ्रेम को कॉललिस्ट रखने के लिए नामसूची के समान क्रम में रखना चाहता हूं।

कोई भी विचार? मेरा वर्तमान कोड अनदेखा किया जा सकता है, कोई समस्या नहीं है।

उत्तर

14

यहाँ एक स्पष्ट दृष्टिकोण

df <- data.frame(a=1:4, e=4:1) 
nms <- c("a", "b", "d", "e") # Vector of columns you want in this data.frame 

Missing <- setdiff(nms, names(df)) # Find names of missing columns 
df[Missing] <- 0     # Add them, filled with '0's 
df <- df[nms]      # Put columns in desired order 
# a b d e 
# 1 1 0 0 4 
# 2 2 0 0 3 
# 3 3 0 0 2 
# 4 4 0 0 1 
+1

आप 'गुम <- setdiff (एनएमएस, नाम (डीएफ)) का उपयोग भी कर सकते हैं जो थोड़ा अधिक पारदर्शी है। –

+1

@ हांगोई - अच्छा सुझाव। यह बहुत अच्छा है, और मैंने इसे शामिल करने के लिए उत्तर संपादित किया है। धन्यवाद! –

1
library(stringr) 
df <- data.frame(X1=1:4,X2=1:4,X5=1:4) 
>df 
    X1 X2 X5 
1 1 1 1 
2 2 2 2 
3 3 3 3 
4 4 4 4 
current <- as.numeric(str_extract(names(df),"[0-9]")) 
missing <-seq(min(current),max(current)) 

df[paste("X",missing[!missing %in% current],sep="")]<-0 

>df[,order(colnames(df))] 
    X1 X2 X3 X4 X5 
1 1 1 0 0 1 
2 2 2 0 0 2 
3 3 3 0 0 3 
4 4 4 0 0 4 
0

धन्यवाद दोस्तों, आप के लिए धन्यवाद मुझे लगता है कि एक (फ़ाइलें) dataframes की सूची और colnames (ncolunas) की एक और सूची के साथ क्या करने में कामयाब रहे है।

for (i in serieI) { 
    if ((identical(colnames(Files[[i]]),ncolunas)) == FALSE) { 

     nms = ncolunas 
      df = Files[[i]] 
      aux = colnames(df) 
      aux1 = row.names(df) 

      Missing = setdiff(nms, colnames(df)) 

      serie = seq(1,length(Missing)) #creating indices 1-5 for loop 
      for (j in serie) { #loop to add colums with zeros 
       df = cbind(df,c(0)) 
      } 
      colnames(df) = c(aux,Missing) #updates columns names 

      df = df[,order(colnames(df))] #put colums into order 
      df = t(as.matrix(df))   #hanges into matrix 
      row.names(df) = aux1   #update lines' names 
      Files[[i]] = df    #updates object from list 
    } 

} 
संबंधित मुद्दे