Add a new row in specific place in a dataframe

前端 未结 4 795
野的像风
野的像风 2020-12-29 11:18

Heres my data:

 > data
  Manufacturers       Models
1   Audi                RS5  
2   BMW                 M3  
3   Cadillac            CTS-V  
4   Lexus           


        
相关标签:
4条回答
  • 2020-12-29 11:33

    I used the @Sergio Mora answer to adapt and solve the question. I saw today the question and I needed a solution.

    insert_row <- function(index, new_row, dat){
      if(is.matrix(dat) && ncol(dat) > 1){
        long <- NROW(dat)
        if(index == 1){
          new_data <- rbind(new_row, dat)  
        }
        else if(index == long){
          new_data <- rbind(dat, new_row)
        }
        else{
          new_data <- rbind(dat[1 : (index - 1), ], new_row, dat[index : long, ])
        }
        row.names(new_data) <- NULL
      }
      else if(ncol(dat) == 1 || is.vector(dat)){
        long <- length(dat)
        if(index == 1){
          new_data <- c(new_row, dat)  
        }
        else if(index == long){
          new_data <- c(dat, new_row)
        }
        else{
          new_data <- c(dat[1 : (index - 1)], new_row, dat[index : long])
        }
        row.names(new_data) <- NULL
      }
      return(new_data)
    }
    
    0 讨论(0)
  • 2020-12-29 11:34

    this function would improve and solve your problem:

    INSERT_NA_ROW <- function(indice, tabla) {
      new_Row <- NA
      long <- NROW(tabla)
      new_Data<- rbind(tabla[1:indice,], new_Row ,tabla[(indice + 1):(long),])
      return(new_Data)
    } # Insert Row in index of dataframe
    

    Thanks for read me!

    0 讨论(0)
  • 2020-12-29 11:38

    If order is an important feature of your dataset then you should codify it in a safe way, e.g., by using an index variable. I wouldn't rely on rownames or the order of the data.frame rows since there are operations where they are not preserved.

    data <- read.table(text="Manufacturers       Models
    1   Audi                RS5  
    2   BMW                 M3  
    3   Cadillac            CTS-V  
    4   Lexus               ISF",header=TRUE)
    
    data$ind <- seq_len(nrow(data))
    data <- rbind(data,data.frame(Manufacturers = "Benz", Models = "C63",ind=3.1))
    data <- data[order(data$ind),]
    
    #   Manufacturers Models ind
    # 1          Audi    RS5 1.0
    # 2           BMW     M3 2.0
    # 3      Cadillac  CTS-V 3.0
    # 5          Benz    C63 3.1
    # 4         Lexus    ISF 4.0
    
    0 讨论(0)
  • 2020-12-29 11:50

    In case you don't want the index but rather a one-off "quick fix" for some spreadsheet-like appearance, you might resort to

    newData <- rbind( data[1:3,], Benz, data[ 4,] )
    
    0 讨论(0)
提交回复
热议问题