1

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

这是一个可重现的示例

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

我知道我可以通过将因子转换为字符或数字和/或通过将未使用的级别添加到因子以使级别匹配来进行比较,例如如何比较具有不同级别的两个因子?

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

输出应该看起来与

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

谢谢您的帮助!

4

2 回答 2

1

==不会与factor类一起工作。一种选择可能是转换为 character并进行元素比较,或者如果打算比较levels, sortthe levels, 进行比较并换行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))
于 2019-12-08T19:26:31.103 回答
1

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

mtcars %>% 
  select(gear, carb) %>% 
  mutate_at(c("gear", "carb"), as_factor) %>%
  mutate(gear_vs_carb = gear == as.character(carb))
于 2019-12-08T20:16:19.247 回答