Reputation: 1285
Here is my dataframe:
ID <- 1:4
var1 <- c("yes","no","yes","no")
var2 <- c("no","no","yes","no")
var3 <- c("yes","yes","no","no")
data <- data.frame(ID, var1, var2, var3)
I want to replace all of the yes
by 1
and no
by 0
in order to have such a table below
ID var1 var2 var3
1 1 1 0 1
2 2 0 0 1
3 3 1 1 0
4 4 0 0 0
Upvotes: 0
Views: 109
Reputation: 887118
Using data.table
library(data.table)
setDT(data)[, (2:4) := lapply(.SD, function(x) as.integer(x == 'yes')), .SDcols = 2:4]
Upvotes: 0
Reputation: 35554
A base
solution:
cbind(data[1], +(data[-1] == "yes"))
# ID var1 var2 var3
# 1 1 1 0 1
# 2 2 0 0 1
# 3 3 1 1 0
# 4 4 0 0 0
Upvotes: 1
Reputation: 39595
One solution would be across()
from tidyverse
:
library(tidyverse)
#Data
ID<-1:4
var1<-c("yes","no","yes","no")
var2<-c("no","no","yes","no")
var3<-c("yes","yes","no","no")
#Code
data<-data.frame(ID,var1,var2,var3,stringsAsFactors = F)
#Solution
data %>%
mutate(across(c(var1:var3), ~ ifelse(.=='yes', 1, 0)))
Output:
ID var1 var2 var3
1 1 1 0 1
2 2 0 0 1
3 3 1 1 0
4 4 0 0 0
And a base R
solution would be using indexing with the values yes/no:
#Solution 2
data[data=='yes']<-1
data[data=='no']<-0
data[,-1] <- sapply(data[,-1],as.numeric)
Output:
ID var1 var2 var3
1 1 1 0 1
2 2 0 0 1
3 3 1 1 0
4 4 0 0 0
Upvotes: 1