2012-02-11 9 views
5

与えられたデータフレームを取得するコードを記述し、欠落している列がないかどうかを確認します。 0またはNA。ここで私が持っているものです:R:列が見つからない場合はデータフレームに追加

> 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") 

この点を超えると、私はそれをハードコーディングせずに不足した列(「×3」)に追加する方法を見つけ出すことはできません。理想的には、新しい完全なデータフレームにnameslistと同じ順序で列を持たせたいと思います。

アイデア?私の現在のコードは無視しても問題ありません。ここで

答えて

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

'Missing < - setdiff(nms、names(df))'を使うこともできます。これはやや透明です。 –

+1

@HongOoi - 良い提案。それははるかに良いです、私はそれを含める答えを編集しました。ありがとう! –

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

みんなありがとう、私はデータフレームのリストにそれを行うために管理し、あなたのおかげで(ファイル)と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 
    } 

}