【问题标题】:recode related values in an efficient way以有效的方式重新编码相关值
【发布时间】:2017-10-02 14:39:10
【问题描述】:

我有一个数据框 df,其中只有一个变量 var 和一些相关值。

df <- data.frame(var = c(rep('AUS',12), rep('NZ',12), rep('ENG',7), rep('SOC',12), 
                            rep('PAK',11), rep('SRI',17), rep('IND',15)))

df %>% count(var)
# # A tibble: 7 x 2
#      var     n
#   <fctr> <int>
# 1    AUS    12
# 2    ENG     7
# 3    IND    15
# 4     NZ    12
# 5    PAK    11
# 6    SOC    12
# 7    SRI    17

基于一些关系,一些值应该用新值重新编码。

df %>% mutate(var = recode(var, 'AUS' = 'A', 'NZ' = 'A', 'ENG' = 'A', 
                           'SOC' = 'A', 'PAK' = 'B', 'SRI' = 'B')) %>% count(var)
# A tibble: 3 x 2
#      var     n
#   <fctr> <int>
# 1      A    43
# 2    IND    15
# 3      B    28

可以看出AB分别重新编码为4和2的值。我也有这个问题的预期解决方案。但是,有没有其他有效的方法来做到这一点,而不是指定关系相同的次数(4,2)??

【问题讨论】:

  • 类似replace(var, var %in% to_change_A, 'A') 和分别用于B?
  • 看起来您有一个自定义列表要重新编码。试试case_when,即df %&gt;% mutate(var = as.character(var), var =case_when(var %in% c('AUS', 'NZ', 'ENG', 'SOC') ~ 'A', var %in% c('PAK', 'SRI') ~ 'B', TRUE ~var))
  • 或者,将替换列表转换为 data.frame 并进行合并/加入。
  • 您的意思是保持 IND 不变吗?还是 IND 也应该得到一个代码?
  • @G5W 是的..(至少现在)。

标签: r dplyr recode


【解决方案1】:

一种方法是使用带有命名条目的向量作为查找表。

Codes = c(rep('A', 4), rep('B', 2), 'IND') 
names(Codes) = c('AUS', 'NZ', 'ENG', 'SOC', 'PAK', 'SRI', 'IND')
df$var = Codes[as.character(df$var)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多