I want to return a data.frame from a function if TRUE, else return NA using return(ifelse(condition, mydf, NA))
However, ifelse strips the column names from the data.frame.
Why are these results different?
> data.frame(1) X1 1 1 > ifelse(TRUE, data.frame(1), NA) [[1]] [1] 1
Some additional insight from dput():
> dput(ifelse(TRUE, data.frame(1), 0)) list(1) > dput(data.frame(1)) structure(list(X1 = 1), .Names = "X1", row.names = c(NA, -1L), class = "data.frame")
R ifelse() Function In R, the ifelse() function is a shorthand vectorized alternative to the standard if...else statement. Most of the functions in R take a vector as input and return a vectorized output. Similarly, the vector equivalent of the traditional if...else block is the ifelse() function.
How to Create a Data Frame. We can create a dataframe in R by passing the variable a,b,c,d into the data. frame() function. We can R create dataframe and name the columns with name() and simply specify the name of the variables.
ifelse
is generally intended for vectorized comparisons, and has side-effects such as these: as it says in ?ifelse
,
‘ifelse’ returns a value with the same shape as ‘test’ ...
so in this case (test
is a vector of length 1) it tries to convert the data frame to a 'vector' (list in this case) of length 1 ...
return(if (condition) mydf else NA)
As a general design point I try to return objects of the same structure no matter what, so I might prefer
if (!condition) mydf[] <- NA return(mydf)
As a general rule, I find that R users (especially coming from other programming languages) start by using if
exclusively, take a while to discover ifelse
, then overuse it for a while, discovering later that you really want to use if
in logical contexts. A similar thing happens with &
and &&
.
See also:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With