Skip to content

how to change the class of a group of objects

4 messages · Ben Mazzotta, Erik Iverson, Henrique Dallazuanna

#
Dear R users,

I would like to change the class of a group of objects in R memory from
"numeric" to "dist". I can manipulate the class using

class(foo) <- bar

but I cannot get the same command to work on groups of variables. When I
use for() loops and lists of names, inevitably I have to specify

class(get("foo")) <- bar

which causes class() to return an error. Could anyone offer some advice
how to manipulate classes and attributes of a list of objects in memory?

Many thanks,
Ben




a <- c(1:5)
b <- c(1:10)
c <- c(1:20)

# What I would like to do is coerce all of these to class "dist".
# How can I write a command that changes the class of a, b, AND c to 
"dist"?
# Most of my answers include a list or a for() loop over (a, b, c)
# How can I write a command that changes attributes of a, b, and c all
at the same time?
# I can force the process to work for a few objects, but it is
time-consuming.
# For reference, I am including the following commands.

class(a)
class(get(letters[1]))
class(a) <- "dist"
class(a) <- NULL
class(a)
class(get(letters[1])) <- "dist"
#
Ben, 

In general, when you define a, b, and c as below, the c() wrapper is not needed, since the : operator returns a vector anyway.  Also, best not to name variables 'c' to avoid confusion with the function you're using. 

Regarding your actual question, lapply(list(a, b, c), "class<-", "dist") might work, but your objects in your example don't seem to be able to be coerced to dist objects.  E.g., as.dist(b) gives an error.  If you have data that can actually work as dist objects, you might try the above line though.

Erik
#
Try this:

assign("a", `class<-`(get("a"), "character"))

On Mon, Nov 23, 2009 at 8:51 PM, Ben Mazzotta
<benjamin.mazzotta at tufts.edu> wrote:

  
    
#
Erik and others,

Many thanks for your assistance. Erik correctly points out that the
as.dist() coercion requires a different format than I was using. The
correct format for input to as.dist() is a square matrix, not a lower
triangle matrix. Once I had that in order, everything went much better.

I had been attempting to coerce a vector of output from lowertri()
directly to an object of class "dist." Instead, what I needed to do was
generate a zero matrix and replace the lower triangle of entries with
the output from lowertri().

In particular, thanks to Henrique Dallazuanna and Phil Spector.

Ben
Erik Iverson wrote: