[R] preserve class in apply function

@vi@e@gross m@iii@g oii gm@ii@com @vi@e@gross m@iii@g oii gm@ii@com
Wed Feb 8 20:41:34 CET 2023


Jorgen is correct that for many purposes, viewing a data.frame as a
collection of vectors of the same length allows you to code fairly complex
logic using whichever vectors you want and result in a vector answer, either
externally or as a new column. Text columns used to make some decisions in
the function are also usable using vectorized functions like ifelse(cond,
when_true, when_false).

And, although much can be done in base R, people often use the
dplyr/tidyverse function of mutate() to do such calculations in a slightly
less wordy way.

You may be looking at apply() as a way to operate one row at a time when an
R paradigm is to be able to operate on all rows sort of at once.

-----Original Message-----
From: R-help <r-help-bounces using r-project.org> On Behalf Of Jorgen Harmse via
R-help
Sent: Wednesday, February 8, 2023 11:10 AM
To: r-help using r-project.org; naresh_gurbuxani using hotmail.com
Subject: Re: [R] preserve class in apply function

What are you trying to do? Why use apply when there is already a vector
addition operation?
df$x+df$y or as.numeric(df$x)+as.numeric(df$y) or
rowSums(as.numeric(df[c('x','y')])).

As noted in other answers, apply will coerce your data frame to a matrix,
and all entries of a matrix must have the same type.

Regards,
Jorgen Harmse.

Message: 1
Date: Tue, 7 Feb 2023 07:51:50 -0500
From: Naresh Gurbuxani <naresh_gurbuxani using hotmail.com>
To: "r-help using r-project.org" <r-help using R-project.org>
Subject: [R] preserve class in apply function
Message-ID:
 
<IA1P223MB049955F19238028D7A818CB2FADB9 using IA1P223MB0499.NAMP223.PROD.OUTLOOK.C
OM>

Content-Type: text/plain; charset="us-ascii"


> Consider a data.frame whose different columns have numeric, character, 
> and factor data.  In apply function, R seems to pass all elements of a 
> row as character.  Is it possible to preserve numeric class?
>
>> mydf <- data.frame(x = rnorm(10), y = runif(10)) apply(mydf, 1, 
>> function(row) {row["x"] + row["y"]})
> [1]  0.60150197 -0.74201827  0.80476392 -0.59729280 -0.02980335  
> 0.31351909 [7] -0.63575990  0.22670658  0.55696314  0.39587314
>> mydf[, "z"] <- sample(letters[1:3], 10, replace = TRUE) apply(mydf, 
>> 1, function(row) {row["x"] + row["y"]})
> Error in row["x"] + row["y"] (from #1) : non-numeric argument to 
> binary operator
>> apply(mydf, 1, function(row) {as.numeric(row["x"]) + 
>> as.numeric(row["y"])})
> [1]  0.60150194 -0.74201826  0.80476394 -0.59729282 -0.02980338  
> 0.31351912 [7] -0.63575991  0.22670663  0.55696309  0.39587311
>> apply(mydf[,c("x", "y")], 1, function(row) {row["x"] + row["y"]})
> [1]  0.60150197 -0.74201827  0.80476392 -0.59729280 -0.02980335  
> 0.31351909 [7] -0.63575990  0.22670658  0.55696314  0.39587314





	[[alternative HTML version deleted]]

______________________________________________
R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list