I want to add new column to my dataframe that only has two values ,1 and 0. 1 if either of the x, y, and z columns have an instance of 1, and 0 otherwise. For instance, with this rule, all but rows 6 and 9 have new column value as 1. But, my code does not work in this way.
I would appreciate if someone could help me on this.
set.seed(1)
x <- sample(1:3, 10, replace = TRUE)
y <- sample(1:3, 10, replace = TRUE)
z <- sample(1:3, 10, replace = TRUE)
df <- data.frame(x,y,z)
for (i in 1:nrow(df)){
if ((df$x[i] == 1)== TRUE | (df$y[i] == 1) == TRUE | (df$z[i] == 1) == TRUE){
df$new <- 1
}
else{
df$new <- 0
}
}
>Solution :
You’ll need indices on your new
-variable. Note though that there are faster ways to achieve this end using the apply
-family instead of a loop (I am sure other’s will post these).
for (i in 1:nrow(df)){
if ((df$x[i] == 1) | (df$y[i] == 1) | (df$z[i] == 1)){
df$new[i] <- 1
}
else{
df$new[i] <- 0
}
}
We could even shorten it to, converting the logical to numeric:
for (i in 1:nrow(df)){
df$new[i] <- +((df$x[i] == 1) | (df$y[i] == 1) | (df$z[i] == 1))
}
Output:
df
x y z new
1 1 3 3 1
2 3 1 1 1
3 1 1 1 1
4 2 1 1 1
5 1 2 1 1
6 3 2 2 0
7 3 2 1 1
8 2 2 1 1
9 2 3 2 0
10 3 1 2 1