在R中因子化字符变量时同时保留名称与层级(对标Stata encode)
问题:在R中实现类似Stata
encode 的功能,同时保留因子标签与层级 现有数据框:
df <- tribble( ~country, ~status, "American Samoa", "non-UN member", "Argentina", "UN member", "Austria", "UN member", "Canada", "UN member", "Norfolk Island", "AU Territory", "Martinique", "FR Territory" )
需求是新增一列fac1,使其同时具备因子的整数层级编码和对应的字符名称(类似Stata中encode命令生成的变量),并基于fac1的编码值生成fac2。
尝试的两种方法均有不足:
- 方法一:将因子转为整数后丢失了字符名称,只剩编码
df1 <- df %>% mutate( fac1 = as.integer(factor(status)), fac2 = ifelse(fac1 == 4, 1, 0) )
- 方法二:保留了因子的字符名称,但无法直接通过整数编码值判断生成
fac2
df2 <- df %>% mutate( fac1 = factor(status), fac2 = ifelse(fac1 == "UN member", 1, 0) )
目标是实现与Stata以下语法相同的功能:
encode status, gen(fact1) gen fact2= 1 if fact1 == 4
解决方案
在R中,因子类型本身就同时存储了整数编码和对应的字符标签,只需正确提取编码值即可实现需求:
library(dplyr) df_final <- df %>% mutate( fac1 = factor(status), # 生成因子列,同时保留字符标签与整数层级 fac2 = ifelse(as.integer(fac1) == 4, 1, 0) # 提取因子的底层整数编码进行判断 )
说明
fac1为因子类型,既可以直接查看对应的字符标签,也可通过as.integer(fac1)获取其底层的整数编码(对应Stata中encode生成的变量编码)- 如果需要指定编码顺序(比如让
UN member对应编码4,与Stata默认的字母排序一致),可以手动指定因子的levels参数:
# 按字母顺序指定层级,确保UN member对应编码4 df_final <- df %>% mutate( fac1 = factor(status, levels = sort(unique(status))), fac2 = ifelse(as.integer(fac1) == 4, 1, 0) )
内容的提问来源于stack exchange,提问作者rez
相关产品推荐
相关产品推荐

