vendredi 6 août 2021

add value to each element in row if row contains match

I have a dataframe df of integers across 6 variables.

a <- c(NA, NA, NA, 0, 0, 1, 1, 1)
b <- c(NA, NA, NA, 2, 2, 3, 3, 3)
c <- c(NA, NA, NA, 2, 2, 3, 3, 3)
d <- c(NA, NA, NA, 1, 1, 2, 2, 2)
e <- c(NA, NA, NA, 0, 0, 1, 1, 1)
f <- c(NA, NA, NA, 0, 0, 1, 1, 1)

df <- data.frame(a, b, c, d, e, f)

print(df)

  a b c d e f
1 NA NA NA NA NA NA
2 NA NA NA NA NA NA
3 NA NA NA NA NA NA
4  0  2  2  1  0  0
5  0  2  2  1  0  0
6  1  3  3  2  1  1
7  1  3  3  2  1  1
8  1  3  3  2  1  1

I would like to add 1 to each row that contains a zero, resulting in:

 a b c d e f
1 NA NA NA NA NA NA
2 NA NA NA NA NA NA
3 NA NA NA NA NA NA
4  1  3  3  2  1  1
5  1  3  3  2  1  1
6  1  3  3  2  1  1
7  1  3  3  2  1  1
8  1  3  3  2  1  1

I've been able to test if a row contains a zero with the following code, which adds a new column of "TRUE" or "FALSE".

df$cont0 <- apply(df, 1, function(x) any(x %in% "0"))

I thought I would this new value to then add 1 to reach row where df$cont0 == "TRUE"

ifelse(df$cont0 == "TRUE", df + 1, df)

This ends up creating a nested list that still does not perform the correct operation. I understand that ifelse is already vectorized, but other than that I'm not sure how to approach this issue. I am open to splitting apart the df into "TRUE" and "FALSE" conditions, then performing the operation on df$cont0 == "TRUE", but they need to be re-merged in the original order as the data are chronological and row order therefore matters. However I suspect there's an easier solution. Thank you!

Aucun commentaire:

Enregistrer un commentaire