Skip to content

Create macro_var in R

4 messages · Amoy Yang, MacQueen, Don, William Dunlap +1 more

#
One more question (see below). I cannot use macro-var, mvar, for creating new name, as shown below. Any?advice is highly appreciated!
?[1]? 698 1214 1003 1167 2549? 824? 944 1937? 935? 570??? 0
Error in new.tab[[mvar]] <- d$pop : object 'new.tab' not found
On Thursday, February 4, 2016 11:02 AM, Amoy Yang <amoy_y at yahoo.com> wrote:
This works although it looks rare by using min(",key,"). Don't know why but just have to remember it. This is a tough part in R.
Thanks for helps!
Amoy
On Wednesday, February 3, 2016 5:25 PM, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
See

? Example 5.? Insert Variables

on the sqldf home page.

? https://github.com/ggrothendieck/sqldf


On Wed, Feb 3, 2016 at 2:16 PM, Amoy Yang via R-help
<r-help at r-project.org> wrote:

  
    
#
Yes, you can use a name stored in a variable to create a new column in a
data frame (guessing that's what you want). Here's an example:
a b
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
a b c
1 1 2 0
2 2 3 1
3 3 4 2
4 4 5 3
5 5 6 4


In your case, the object named "new.tab" does not exist when you try to
create a new variable in it. That's what the error message says.

Try, perhaps,

new.tab <- tab
new.tab[[mvar]] <- d$pop


(and hope that the number of elements in d$pop is the same as the number
of rows in new.tab)

-Don
#
If 'tab' is a data.frame then new.tab <- tab[[mvar]] is a column from that
data.frame, not a data.frame with one column.  new.tab <- tab[ , mvar,
drop=FALSE ] will give you a data.frame that you can add to with either of
    nvar <- "newName"
    new.tab[ , nvar] <- newColumn
    new.tab[[nvar]] <- newColumn

If you have a fixed name for the new column (not a variable containing
the name), you can also use
    new.tab <- cbind(new.tab, newName=newColumn)
    new.tab$newName <- newColumn


Bill Dunlap
TIBCO Software
wdunlap tibco.com

On Fri, Feb 5, 2016 at 8:53 AM, Amoy Yang via R-help <r-help at r-project.org>
wrote:

  
  
#
You REALLY NEED to read the "Introduction to R" document discussion of indexing. 

tab is a variable. It is apparently a data.frame. tab[[mvar]] is an expression that retrieves part of the data in the tab data.frame. The data it returns is a vector, not a data.frame. 

The "[[" operator extracts an element of a list.  A data.frame is a list of vectors (all of the same length). A vector of mode "numeric" is just numbers, not a list. 

You created a new variable new.pop that holds a numeric vector. You printed it and confirmed that that is what it is. 

You then tried to refer to a variable that you have NOT created, new.tab. However,  if you had tried the expression new.pop[[mvar]] you would have been trying to treat a numeric vector as a list, which it is not... and if it was it would have to have an element named pop inside it already to extract something, which it doesn't. 

A key step in getting out of your state of confusion is to learn how objects can contain other objects, and when to work with containing objects and when to work work contained objects. 

Some possible solutions:

new.tab <- data.frame( pop=new.pop )

or

new.tab <- data.frame( pop = tab[[mvar]] )

or

new.tab <- tab[ , "pop", drop=FALSE )

With which you can then add new columns

new.tab$pop2 <- new.pop ^2
new.pop[[ "pop3" ]] <- new.pop^3