I want to add a new variable (N_notNAs) to my data frame, which defines whether any of the other variables is NA.
x y z N_notNAs
2 3 NA NA
NA 1 3 NA
2 3 5 1
4 4 3 1
Not sure why this is your desired output, but a possible way to achieve this is summing the NA
per row and put it the power of NA
- this way NA^0 will return 1, and everything else will become NA
NA^rowSums(is.na(df))
# [1] NA NA 1 1
@David Arenburg's solution is very nifty but here are a few more anyways.
The first 4 assume that the columns of df
are numeric and use the same basic idea whereas the last 3 do not require numeric columns. They also use a common idea.
The ifelse
solution is longest in terms of character count but may be more readable and least tricky.
As mentioned by a @alexis_laz below, apply(...)
could be replaced with !complete.cases(df)
in the last 3 solutions and with some simplifications we would get ifelse(complete.cases(df), 1, NA)
, c(NA, 1)[complete.cases(df) + 1]
and match(complete.cases(df), TRUE)
.
rowSums(0*df) + 1
max.col(0*df) + 1
do.call(pmin, 0*df) + 1
do.call(pmax, 0*df) + 1
ifelse(apply(df, 1, anyNA), NA, 1)
c(NA, 1)[apply(df, 1, anyNA) + 1]
match(apply(df, 1, anyNA), FALSE)
There is some question of why you want a column that is NA or 1. If you wanted a logical TRUE/FALSE result then apply(df, 1, anyNA)
would do.
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