1
votes

I have a data frame "CB" with a column "gender" with two variables "Male" and "Female". I want that "Male" gets the value 0 and "Female" gets the value 1.

I did this:

CB$gender <- ifelse(CB$gender == "Male", 0, ifelse(CB$gender == "Female", 1, 
999))

When I look at the column I get this result:

head(CB$gender, 3)
[1] 1 0 0

That´s fine!

When I make a table I get this result:

table(CB$gender)

  0    1 
3555 3488 

I want that 0 says "Male" and 1 says "Female"

For better understanding:

In SPSS it is possible to assign the value 0 to "Male" and the value 1 to "Female". When I print a table it looks like this:

Male Female
3555 3488 

But the column looks like this:

gender
0
1
1
0

This is what I want.

Thank you!

1
CB$gender <- factor(CB$gender, 0:1, labels = c("Male", "Female")). The column will still say Male and Female though. AFAIK, the way SPSS displays it is not possible in R, except when you call the column with as.numeric(CB$gender).LAP
CB$gender = "Male" is single equal sign a typo, should be == ?zx8754
If I use your solution I get: head(CB$gender, 3) [1] Female Male Male Levels: Male Female again. "0" and "1" for "Male" and "Female" are gone.Hadsga

1 Answers

2
votes

You can use factor to turn a variable into a factor and label it:

CB <- data.frame(gender= c("Male", "Female", "Male", "Male", "Female", "Female", "Male", "Male"))
CB$gender <- ifelse(CB$gender == "Male", 0, ifelse(CB$gender == "Female", 1, 999))
str(CB)
#'data.frame':  8 obs. of  1 variable:
# $ gender: num  0 1 0 0 1 1 0 0
CB$gender <- factor(CB$gender ,
                labels=c("Male", "Female"))
str(CB)
#'data.frame':  8 obs. of  1 variable:
# $ gender: Factor w/ 2 levels "Male","Female": 1 2 1 1 2 2 1 1
table(CB$gender)
#Male Female 
#   5      3 

NOTE: R by turning into factors assigns levels from 1 (in this case 1 & 2)

Alternatively, you could use packages lfactors:

library(lfactors)
CB <- data.frame(gender= c("Male", "Female", "Male", "Male", "Female", "Female", "Male", "Male"))
CB$gender <- ifelse(CB$gender == "Male", 0, ifelse(CB$gender == "Female", 1, 999))
CB$gender <- lfactor(CB$gender,
                 levels=0:1,
                 labels=c("Male", "Female"))
print(CB$gender)
#[1] Male   Female Male   Male   Female Female Male   Male  
#Levels: Male Female
#Numeric levels: 0 1 
table(CB$gender)
#  Male Female 
#     5      3 
attributes(CB$gender)$llevels
#[1] 0 1

Yet another option, closest to SPSS analogy, is to use package labelled and sjmisc as follows:

library(labelled)
library(sjmisc) #access to function to_label()
CB <- data.frame(gender= c("Male", "Female", "Male", "Male", "Female", "Female", "Male", "Male"))
CB$gender <- ifelse(CB$gender == "Male", 0, ifelse(CB$gender == "Female", 1, 999))
val_labels(CB$gender) <- c("Male" = 0, "Female" = 1)
print(CB$gender)
#<Labelled double>
#[1] 0 1 0 0 1 1 0 0
#Labels:
# value  label
#     0   Male
#     1 Female
table(to_label(CB$gender))
#  Male Female 
#     5      3 

Also, you can use a combination of packages sjmisc and sjlabelled.

library(sjmisc) #access to function to_label()
library(sjlabelled) #function set_labels()
CB <- data.frame(gender= c("Male", "Female", "Male", "Male", "Female", "Female", "Male", "Male"))
CB$gender <- ifelse(CB$gender == "Male", 0, ifelse(CB$gender == "Female", 1, 999))
CB$gender <- set_labels(CB$gender, labels=c("Male", "Female"))
print(CB$gender)
#[1] 0 1 0 0 1 1 0 0
#attr(,"labels")
#  Male Female 
#     0      1 
table(to_label(CB$gender))
#  Male Female 
#     5      3 

The function to_label() works similarly with the packages lfactors, labelled and sjlabelled.