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 at hotmail.com> To: "r-help at r-project.org" <r-help at R-project.org> Subject: [R] preserve class in apply function Message-ID: <IA1P223MB049955F19238028D7A818CB2FADB9 at IA1P223MB0499.NAMP223.PROD.OUTLOOK.COM> 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]]
@vi@e@gross m@iii@g oii gm@ii@com
2023-Feb-08 19:41 UTC
[R] preserve class in apply function
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 at r-project.org> On Behalf Of Jorgen Harmse via R-help Sent: Wednesday, February 8, 2023 11:10 AM To: r-help at r-project.org; naresh_gurbuxani at 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 at hotmail.com> To: "r-help at r-project.org" <r-help at R-project.org> Subject: [R] preserve class in apply function Message-ID: <IA1P223MB049955F19238028D7A818CB2FADB9 at 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 at 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.