【问题标题】:How to use recode_factor in dplyr for recoding multiple factor values?如何在 dplyr 中使用 recode_factor 来重新编码多个因子值?
【发布时间】:2018-04-03 15:16:43
【问题描述】:
     countrycode event
1713         ESP 110mh
1009         NED    HJ
536          BLR    LJ
2882         FRA 1500m
509          EST    LJ
2449         BEL    PV
1022         EST    HJ
2530         USA    JT
2714         CUB    JT
1236         HUN  400m
238          BLR  100m
2518         USA    JT
1575         FRA 110mh
615          JPN    LJ
1144         GER    HJ
596          CAN    LJ
2477         HUN    JT
1046         GER    HJ
2501         FIN    DT
2176         KAZ    PV

我想在我的数据框中创建一个新的因子向量 eventtype,其中:

event 变量中带有100m400m110mh1500m 的行被分组为RunsDTSPJT 被分组为Throws;和LJHJPV,被分组为Jumps

我可以使用 df$eventtype <- recode_factor(df$event, `100m`="Running") 之类的东西单独创建一个新的向量值,它适用于一个事件,但我查看了文档,没有一种简单的方法可以在一个函数调用中转换多个值。

编辑:当然,如果有其他功能更适合我的目的,我会使用它。

【问题讨论】:

  • dplyr:查看 case_when 或在基础 R 中的 ifelse 语句。而你遗漏了110mh 应该是什么

标签: r dplyr tidyverse recode


【解决方案1】:

recode_factor 函数的 ... 参数可以采用任意数量的参数...

library(dplyr)

df <- read.table(header = T, text = "
number countrycode event
1713         ESP 110mh
1009         NED    HJ
536          BLR    LJ
2882         FRA 1500m
509          EST    LJ
2449         BEL    PV
1022         EST    HJ
2530         USA    JT
2714         CUB    JT
1236         HUN  400m
238          BLR  100m
2518         USA    JT
1575         FRA 110mh
615          JPN    LJ
1144         GER    HJ
596          CAN    LJ
2477         HUN    JT
1046         GER    HJ
2501         FIN    DT
2176         KAZ    PV
")

df$eventtype <- recode_factor(df$event, `100m` = "Runs", `400m` = "Runs", 
                              `110mh` = "Runs", `1500m` = "Runs", 
                              DT = "Throws", SP = "Throws", JT = "Throws",
                              LJ = "Jumps", HJ = "Jumps", PV = "Jumps")

# or inside a mutate command
df %>% 
  mutate(eventtype = recode_factor(event, `100m` = "Runs", `400m` = "Runs", 
                                   `110mh` = "Runs", `1500m` = "Runs", 
                                   DT = "Throws", SP = "Throws", JT = "Throws",
                                   LJ = "Jumps", HJ = "Jumps", PV = "Jumps"))

【讨论】:

    【解决方案2】:

    ifelse 是您所需要的。这是一些示例代码,因为您没有可重现的示例。

    countycode = c("ESP", "HUN", "KAZ")
    event = c("100m", "JT", "PV")
    data = as.data.frame(cbind(countycode,event))
    
    # generate the recode groups.
    runs = c("100m", "400m", "1500m")
    throws = c("JT", "SP")
    jumps = c("HJ", "PV")
    
    # add another column.
    data$eventtype = ifelse(data$event %in% runs, "Runs", 
                            ifelse(data$event %in% throws, "Throws",
                                  ifelse(data$event %in% jumps, "Jumps",
                                         NA)))
    

    运行后:

    > data
      countycode event eventtype
    1        ESP  100m      Runs
    2        HUN    JT    Throws
    3        KAZ    PV     Jumps
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 2018-05-11
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多