Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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"]"  ## or, j = "dat2[,2]"
assign(j,1:50)

The approach above doesn't work. Neither does this:

j = "dat2"
assign(get(j)[,"VAR1"],1:50)
like image 909
baha-kev Avatar asked Mar 27 '13 21:03

baha-kev


People also ask

How do you assign a value to a column in a data frame?

DataFrame - assign() function The assign() function is used to assign new columns to a DataFrame. Returns a new object with all original columns in addition to new ones. Existing columns that are re-assigned will be overwritten. The column names are keywords.

How do I get certain columns from a data frame?

To select a single column, use square brackets [] with the column name of the column of interest.

How do I get a specific column in pandas?

You can use the loc and iloc functions to access columns in a Pandas DataFrame. Let's see how. If we wanted to access a certain column in our DataFrame, for example the Grades column, we could simply use the loc function and specify the name of the column in order to retrieve it.

How do I get a specific value in a DataFrame cell?

Select Cell Value from DataFrame Using df['col_name']. values[] We can use df['col_name']. values[] to get 1×1 DataFrame as a NumPy array, then access the first and only value of that array to get a cell value, for instance, df["Duration"].


2 Answers

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)

like image 137
mnel Avatar answered Oct 04 '22 11:10

mnel


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 ...
like image 38
IRTFM Avatar answered Oct 04 '22 12:10

IRTFM