【问题标题】:Assign value label to the shaping of a variable将值标签分配给变量的形状
【发布时间】:2017-08-15 09:56:30
【问题描述】:

我有一个数据框“CB”,其中有一列“性别”,其中包含两个变量“男性”和“女性”。 我希望“男性”的值为 0,而“女性”的值为 1。

我这样做了:

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

当我查看该列时,我得到以下结果:

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

没关系!

当我制作表格时,我得到了这个结果:

table(CB$gender)

  0    1 
3555 3488 

我希望 0 表示“男性”,1 表示“女性”

为了更好地理解:

在 SPSS 中,可以将值 0 分配给“男性”,将值 1 分配给“女性”。当我打印一张表格时,它看起来像这样:

Male Female
3555 3488 

但列看起来像这样:

gender
0
1
1
0

这就是我想要的。

谢谢!

【问题讨论】:

  • CB$gender &lt;- factor(CB$gender, 0:1, labels = c("Male", "Female"))。不过,该列仍会显示MaleFemale。 AFAIK,SPSS 显示它的方式在 R 中是不可能的,除非您使用 as.numeric(CB$gender) 调用列。
  • CB$gender = "Male" 是单等号拼写错误,应该是== ?
  • 如果我使用您的解决方案,我会再次得到:head(CB$gender, 3) [1] Female Male Male Levels: Male Female。 “男性”和“女性”的“0”和“1”不见了。

标签: r


【解决方案1】:

您可以使用factor 将变量转换为因子并标记它:

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 

注意:R 通过转换为因子分配级别 1(在本例中为 1 和 2)

或者,您可以使用包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

另一个最接近 SPSS 类比的选项是使用包 labelledsjmisc,如下所示:

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 

此外,您可以组合使用包sjmiscsjlabelled

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 

函数to_label() 与包lfactorslabelledsjlabelled 的工作方式类似。

【讨论】:

  • 嗨,如果我使用您的第一个解决方案,我会在我的专栏中再次获得:Gender: Female, Male, Female....
  • 第一个选项是R中处理因子的原生方式,levels是进来的,label是因子分解的结果。如果您不能使用第一个解决方案,请查看我添加的其他选项(包 lfactors、labelled、sjmisc 和 sjlabelled)
  • 使用sjmisc::to_value() 更简单:to_value(CB$gender, start.at = 0) 会将因子转换为数字,并将之前的因子水平保留为值标签。然后您可以使用sjmisc::frq(CB, gender),它会显示值和标签。
猜你喜欢
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 2021-11-09
  • 2021-12-22
  • 2013-03-05
  • 1970-01-01
相关资源
最近更新 更多