【问题标题】:Compare factors with different levels, in a dataframe在数据框中比较不同级别的因素
【发布时间】:2019-12-08 19:23:25
【问题描述】:

我正在尝试比较数据框中的两个因素以创建一个新变量。因素有不同的水平,这是抛出一个错误。

这是一个可重现的例子

library(dplyr)
library(forcats)

mtcars %>% 
  select(gear, carb) %>% 
  mutate_at(c("gear", "carb"), ~as_factor(.)) %>%
  mutate(gear_vs_carb = gear == carb)

这是错误:

Error in Ops.factor(gear, carb) : level sets of factors are different

我知道我可以通过将因子转换为字符或数字和/或通过将未使用的级别添加到因子以使级别匹配来进行比较,例如How can I compare two factors with different levels?

但是是否可以直接与原始因子进行比较

输出应该与 for 相同

mtcars %>% 
  select(gear, carb) %>% 
  mutate(gear_vs_carb = gear == carb)

感谢您的帮助!

【问题讨论】:

    标签: r dplyr r-factor forcats


    【解决方案1】:

    == 不适用于 factor 类。一种选择可能是转换为character 并进行元素比较,或者如果打算比较levelssortlevels,则进行比较并用all 包装

    library(dplyr)
    mtcars %>% 
       select(gear, carb) %>% 
       mutate_at(c("gear", "carb"), ~as_factor(.)) %>%
       mutate(gear_vs_carb =  all(sort(levels(gear)) == sort(levels(carb))))
       #or use intersect
       #  mutate(gear_vs_carb = length(intersect(levels(gear), 
       #          levels(carb))) == nlevels(gear))
    

    如果我们进行元素比较,请转换为 character 类和 as.character 然后进行比较

    mtcars %>% 
       select(gear, carb) %>% 
       mutate_at(c("gear", "carb"), ~as_factor(.)) %>%
       mutate(gear_vs_carb = as.character(gear) == as.character(carb))
    

    【讨论】:

      【解决方案2】:

      您只需要将一个因素转换为字符,而不是两者。

      mtcars %>% 
        select(gear, carb) %>% 
        mutate_at(c("gear", "carb"), as_factor) %>%
        mutate(gear_vs_carb = gear == as.character(carb))
      

      【讨论】:

        猜你喜欢
        • 2019-03-14
        • 2020-10-08
        • 2013-12-14
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        • 2013-11-26
        • 2017-03-28
        相关资源
        最近更新 更多