How to add multiple columns to a data.frame in one go?

前端 未结 2 821
时光取名叫无心
时光取名叫无心 2020-12-05 14:26

I have following dataframe and vector:

ddf = data.frame(a=rep(1,10), b=rep(2,10))
xx = c(\"c\", \"d\", \"e\", \"f\")

How can I new empty c

相关标签:
2条回答
  • 2020-12-05 14:48

    This seems to succeed:

    > cbind(ddf, setNames( lapply(xx, function(x) x=NA), xx) )
       a b  c  d  e  f
    1  1 2 NA NA NA NA
    2  1 2 NA NA NA NA
    3  1 2 NA NA NA NA
    4  1 2 NA NA NA NA
    5  1 2 NA NA NA NA
    6  1 2 NA NA NA NA
    7  1 2 NA NA NA NA
    8  1 2 NA NA NA NA
    9  1 2 NA NA NA NA
    10 1 2 NA NA NA NA
    
    0 讨论(0)
  • 2020-12-05 15:11

    This will get you there:

    ddf[xx] <- NA
    
    #   a b  c  d  e  f
    #1  1 2 NA NA NA NA
    #2  1 2 NA NA NA NA
    #3  1 2 NA NA NA NA
    #...
    

    You can't directly use something like ddf$xx because this will try to assign to a column called xx rather than interpreting xx. You need to use [ and [<- functions, using the square brackets when you are dealing with a character string/vector - like ddf["columnname"] or ddf[c("col1","col2")], or a stored vector like your ddf[xx].

    The reason why it selects columns is because data.frames are lists essentially:

    is.list(ddf)
    #[1] TRUE
    
    as.list(ddf)
    #$a
    # [1] 1 1 1 1 1 1 1 1 1 1
    # 
    #$b
    # [1] 2 2 2 2 2 2 2 2 2 2
    

    ...with each column corresponding to a list entry. So if you don't use a comma to specify a row, like ddf["name",] or a column like ddf[,"name"], you get the column by default.


    In the case that you are working with a 0-row dataset, you can not use a value like NA as the replacement. Instead, replace with list(character(0)) where character(0) can be substituted for numeric(0), integer(0), logical(0) etc, depending on the class you want for your new columns.

    ddf <- data.frame(a=character())
    xx <- c("c", "d", "e", "f")
    ddf[xx] <- list(character(0))
    ddf
    #[1] a c d e f
    #<0 rows> (or 0-length row.names)
    
    0 讨论(0)
提交回复
热议问题