I am trying to efficiently create a binary dummy variables (1/0) in my data set based on whether or not one or more of 7 variables (col9-15) in the data set take on a specific value (35), but I don't want to test all columns.
While as.numeric is ideal usually, I can only get it to work with one column at a time:
data$indicator <- as.numeric(data$col1 == 35)
Any idea how I can modify the above code so that if any of data$col9
- data$col15
are "35" then my indicator variable takes on a 1?
Thanks!!!
You can use rowSums
(vectorized solution) like this :
set.seed(123)
dat <- matrix(sample(c(35,1:100),size=15*20,rep=T),ncol=15,byrow=T)
cbind(dat,rowSums(dat[,9:15] == 35) > 0)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
[1,] 29 79 41 89 94 4 53 90 55 46 96 45 68 57 10 0
[2,] 90 24 4 33 96 89 69 64 100 66 71 54 60 29 14 0
[3,] 97 91 69 80 2 48 76 21 32 23 14 41 41 37 15 0
[4,] 14 23 47 26 86 4 44 80 12 56 20 12 76 90 37 0
[5,] 67 9 38 27 82 45 81 82 80 44 76 63 71 35 48 1
[6,] 22 38 61 35 11 24 67 42 79 10 43 99 90 89 17 0
[7,] 13 65 34 66 32 18 79 9 47 51 60 33 49 96 48 0
[8,] 89 92 61 41 14 94 30 6 95 72 14 55 96 59 40 0
[9,] 65 32 31 22 37 99 15 9 14 69 62 90 67 74 52 0
[10,] 66 83 79 98 44 31 41 1 18 85 23 24 7 24 73 0
[11,] 85 50 39 24 11 39 57 21 44 22 50 35 65 37 35 1
[12,] 53 74 22 41 26 63 18 87 75 67 62 37 53 88 58 0
[13,] 84 31 71 26 60 48 26 57 92 91 27 32 99 62 94 0
[14,] 47 41 66 15 57 24 97 60 52 40 88 36 29 17 17 0
[15,] 48 25 21 68 4 70 35 41 82 92 28 97 73 69 5 0
[16,] 39 48 56 70 92 62 43 54 5 26 40 19 84 15 81 0
[17,] 55 66 17 63 31 73 40 97 97 73 25 22 59 27 53 0
[18,] 79 16 40 47 87 93 89 68 95 52 58 33 35 2 50 1
[19,] 87 35 7 16 77 74 98 47 7 65 76 13 40 22 5 0
[20,] 39 6 22 5 67 30 10 7 88 76 82 99 10 10 80 0
EDIT
I replace the cbind
by transform
. Since the column will be boolean I coerce it to get 0/1.
transform(dat,x=as.numeric((rowSums(dat[,9:15] == 35) > 0)))
The result is a data.frame.( coerced from matrix by transform)
EDIT2 ( as suggested by @flodel)
data$indicator <- as.integer(rowSums(data[paste0("col", 9:15)] == 35) > 0)
where data
is the OP's data.frame.
apply to the rescue :)
# this sample data frame is pre-loaded
mtcars
# test whether any of the values in the
# 2nd - 5th columns of mtcars equal four..
# save the result into a new vector..
indicator.col <-
apply(
mtcars[ , 2:5 ] ,
1 ,
FUN = function( x ) max( x == 4 )
)
# ..that quickly binds onto mtcars
# and bind it with the original mtcars
mtcars2 <- cbind( mtcars , indicator.col )
# look at your result
mtcars2
you can also try this (borrowing sample data from agstudy's answer)
> set.seed(123)
> dat <- matrix(sample(c(35,1:100),size=15*20,rep=T),ncol=15,byrow=T)
#Create indicator initialized with 0.
> indicator <- rep(0, nrow(dat))
#Replace the elements at indices which are equal to rows in dat where you find 35
> indicator[which(dat[,9:15]==35)%%nrow(dat)] <- 1
#bind the indicator to original data
> cbind(dat, indicator)
indicator
[1,] 29 79 41 89 94 4 53 90 55 46 96 45 68 57 10 0
[2,] 90 24 4 33 96 89 69 64 100 66 71 54 60 29 14 0
[3,] 97 91 69 80 2 48 76 21 32 23 14 41 41 37 15 0
[4,] 14 23 47 26 86 4 44 80 12 56 20 12 76 90 37 0
[5,] 67 9 38 27 82 45 81 82 80 44 76 63 71 35 48 1
[6,] 22 38 61 35 11 24 67 42 79 10 43 99 90 89 17 0
[7,] 13 65 34 66 32 18 79 9 47 51 60 33 49 96 48 0
[8,] 89 92 61 41 14 94 30 6 95 72 14 55 96 59 40 0
[9,] 65 32 31 22 37 99 15 9 14 69 62 90 67 74 52 0
[10,] 66 83 79 98 44 31 41 1 18 85 23 24 7 24 73 0
[11,] 85 50 39 24 11 39 57 21 44 22 50 35 65 37 35 1
[12,] 53 74 22 41 26 63 18 87 75 67 62 37 53 88 58 0
[13,] 84 31 71 26 60 48 26 57 92 91 27 32 99 62 94 0
[14,] 47 41 66 15 57 24 97 60 52 40 88 36 29 17 17 0
[15,] 48 25 21 68 4 70 35 41 82 92 28 97 73 69 5 0
[16,] 39 48 56 70 92 62 43 54 5 26 40 19 84 15 81 0
[17,] 55 66 17 63 31 73 40 97 97 73 25 22 59 27 53 0
[18,] 79 16 40 47 87 93 89 68 95 52 58 33 35 2 50 1
[19,] 87 35 7 16 77 74 98 47 7 65 76 13 40 22 5 0
[20,] 39 6 22 5 67 30 10 7 88 76 82 99 10 10 80 0
来源:https://stackoverflow.com/questions/15015744/how-to-create-a-single-dummy-variable-with-conditions-in-multiple-columns