R: Найти недостающие столбцы, добавить в фрейм данных, если отсутствует - PullRequest
7 голосов
/ 11 февраля 2012

Я хотел бы написать некоторый код, который будет принимать данный кадр данных, проверить, отсутствуют ли какие-либо столбцы, и если да, добавить отсутствующие столбцы, заполненные 0 или NA. Вот что у меня есть:

> 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") без его жесткого кодирования. В идеале я хотел бы, чтобы новый, полный фрейм данных имел столбцы в том же порядке, что и список имен.

Есть идеи? Мой текущий код можно игнорировать, нет проблем.

Ответы [ 3 ]

17 голосов
/ 11 февраля 2012

Вот простой подход

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 голос
/ 11 февраля 2012
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 голосов
/ 27 мая 2015

Спасибо, ребята, благодаря вам мне удалось сделать это с помощью списка данных (файлов) и другого списка имен (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
     } 

 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...