简体   繁体   中英

Assign value label to the shaping of a variable

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!

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 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM