不等因子级别:强制转换为字符绑定字符和因子向量,强制转换为字符向量绑定字符和因子

Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor

我不确定这里有什么问题。

dplyr::tibble(x = rnorm(100), group = rep(c('a','b'), 50)) %>% 
  dplyr::group_by(group) %>% 
  mutate(bin = OneR::bin(x, nbins = 10))

不等因子级别:强制转换为字符绑定字符和因子向量,强制转换为字符向量绑定字符和因子向量,强制转换为字符向量

但是当添加 labels = 1:10 时这有效。

dplyr::tibble(x = rnorm(100), group = rep(c('a','b'), 50)) %>% 
  dplyr::group_by(group) %>% 
  mutate(bin = OneR::bin(x, nbins = 10, labels = 1:10))

想知道第一种情况出错的原因

好吧,正如 Matt 指出的那样,与其说是错误,不如说是警告。该警告依赖于您的箱子取决于每个组中的数据这一事实。由于 bin 名称(又名 labels)是自动设置的,因此您可以为每个组获得不同的因子水平。在内部,dplyr 将所有组绑定在一起,您实际上加入了它们。加入时,不相等的因子标签不应匹配在一起(您只会看到字符串,但它在下面存储为数字)。由于您宁愿保留每个值的标签而不是数字,dplyr 将其转换为字符。 请参阅我手动进行分组的示例:

set.seed(0)
dplyr::tibble(x = rnorm(100), group = rep(c('a','b'), 50)) %>% 
 dplyr::group_by(group) %>% 
  mutate(bin = OneR::bin(x, nbins = 10))

set.seed(0)
data1 <- dplyr::tibble(x = rnorm(100), group = rep(c('a','b'), 50)) %>% 
  filter(group == "a") %>% 
  mutate(bin = OneR::bin(x, nbins = 10))

set.seed(0)
data2 <- dplyr::tibble(x = rnorm(100), group = rep(c('a','b'), 50)) %>% 
  filter(group == "b") %>% 
  mutate(bin = OneR::bin(x, nbins = 10))

# same warning pops out
bind_rows(data1, data2)