How to use `assign()` or `get()` on specific named column of a dataframe?

前端 未结 2 1920
故里飘歌
故里飘歌 2020-12-16 07:26

Is there a way to assign a value to a specific column within a data frame? e.g.,

dat2 = data.frame(c1 = 101:149, VAR1 = 151:200)    
j = \"dat2[,\"VAR1\"]\"          


        
相关标签:
2条回答
  • 2020-12-16 07:58
    set2 <- function(x,  val) {
       eval.parent(substitute(x <- val))
     }
    
    > dat2 = data.frame(c1 = 101:150, VAR1 = 151:200)
    > set2(dat2[["VAR1"]], 1:50)
    > str(dat2)
    'data.frame':   50 obs. of  2 variables:
     $ c1  : int  101 102 103 104 105 106 107 108 109 110 ...
     $ VAR1: int  1 2 3 4 5 6 7 8 9 10 ...
    
    0 讨论(0)
  • 2020-12-16 08:02

    lets assume that we have a valid data.frame with 50 rows in each

    dat2 <- data.frame(c1 = 1:50, VAR1 = 51:100)
    

    1 . Don't use assign and get if you can avoid it.

    "dat2[,"VAR1"]" is not valid in R.

    You can also note this from the help page for assign

    assign does not dispatch assignment methods, so it cannot be used to set elements of vectors, names, attributes, etc.

    Note that assignment to an attached list or data frame changes the attached copy and not the original object: see attach and with.

    A column of a data.frame is an element of a list

    What you are looking for is [[<-

    # assign the values from column (named element of the list) `VAR1`
    j <- dat2[['VAR1']] 
    

    If you want to assign new values to VAR1 within dat2,

    dat2[['VAR1']] <- 1:50
    

    The answer to your question....

    To manipulate entirely using character strings using get and assign

    assign('dat2', `[[<-`(get('dat2'), 'VAR1', value = 2:51))
    

    Other approaches

    data.table::set

    if you want to assign by reference within a data.frame or data.table (replacing an existing column only) then set from the data.table package works (even with data.frames)

    library(data.table)
    set(dat2, j = 'VAR1', value = 5:54)
    

    eval and bquote

    dat1 <- data.frame(x=1:5)
    dat2 <- data.frame(x=2:6)
    
    
    
    for(x in sapply(c('dat1','dat2'),as.name)) {
      eval(bquote(.(x)[['VAR1']] <- 2:6))
    }
    

    eapply

    Or if you use a separate environment

    ee <- new.env()
    ee$dat1 <- dat1
    ee$dat2 <- dat2
    
    # eapply returns a list, so use list2env to assign back to ee
    list2env(eapply(ee, `[[<-`, 'y', value =1:5), envir = ee)
    

    0 讨论(0)
提交回复
热议问题