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

时间:2019-10-23 14:32:20

标签: r dplyr binning

我不确定这是什么问题。

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))

我想知道第一种情况下错误的原因。

1 个答案:

答案 0 :(得分:2)

正如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)