bind_rows_(x, .id) 中的错误:无法将列从因子转换为数字

Posted

技术标签:

【中文标题】bind_rows_(x, .id) 中的错误:无法将列从因子转换为数字【英文标题】:Error in bind_rows_(x, .id) : Column can't be converted from factor to numeric 【发布时间】:2018-03-29 01:52:39 【问题描述】:

我有十个数据集,它们使用 xlsx 库从 Excel 文件中读取,并存储在 tibbles 中。我想合并它们。

这里是示例数据集。数据集之间的变量数量不同,并且某些变量仅在一个数据集中。 person 变量的值永远不会重叠。

data1 <- tibble(person = c("A","B","C"),
    test1 = as.factor(c(1,4,5)), 
    test2 = c(14,25,10),
    test3 = c(12.5,16.0,4),
    test4 = c(16,23,21),
    test5 = as.factor(c(49,36,52)))

data2 <- tibble(person = c("D","E","F"),
    test1 = c(8,7,2), 
    test3 = c(6.5,12.0,19.5),
    test4 = as.factor(c(15,21,29)),
    test5 = as.factor(c(54,51,36)),
    test6 = c(32,32,29),
    test7 = c(13,11,10))

实际的数据集通常有大约 50 行和大约 200 个变量。我试过了

    all_data <- dplyr::bind_rows(data1,data2)

希望得到这样的结果

# A tibble: 6 x 8
  person test1 test2 test3 test4 test5 test6 test7
   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1      A     1    14  12.5    16    49    NA    NA
2      B     4    25  16.0    23    36    NA    NA
3      C     5    10   4.0    21    52    NA    NA
4      D     8    NA   6.5    15    54    32    13
5      E     7    NA  12.0    21    51    32    11
6      F     2    NA  19.5    29    36    29    10

但是我得到了这个错误

Error in bind_rows_(x, .id) : Column `test1` can't be converted from factor to numeric

我搜索了 ***,发现了与此相关的问题,大多数答案都集中在尝试将变量转换为另一个类。但我不在乎我的变量有哪些类,因为我只会将合并的数据集写入 CSV 文件或 Excel 文件。

难道没有某种简单的解决方法吗?

【问题讨论】:

对于这种情况,rbindlist 似乎工作正常,即library(data.table);list(data1, data2) %&gt;% rbindlist(., fill = TRUE) 【参考方案1】:

我认为这应该可行:

library(plyr)
all_data <- rbind.fill(data1,data2)

【讨论】:

不幸的是,一些 SO 用户喜欢在不解释原因的情况下对答案投反对票。以我的经验, rbind.fill 有时会给出意想不到的结果(出乎我的意料,数据框中会弹出一个错误的数字)。更有经验的 R 用户可能会解释原因。【参考方案2】:

由于文件通常很小(几百行)并且您只是想将两个文件合并并写入一个新文件,我认为我们可以将所有列转换为字符,因此data1和@中的公共列987654322@ 将具有相同的类型。

library(dplyr)
bind_rows(mutate_all(data1, as.character), mutate_all(data2, as.character))

【讨论】:

如果得到相同的错误,但在我的情况下,我有一个小标题列表(大约 10 个小标题,总共有超过 2k 个不同的列)怎么办?有些小标题不包含有问题的列。 @Miha,我不知道你的数据到底长什么样。 bind_rows(lapply(tibble_list, function(dtt)mutate_all(dtt, as.character))) 有效吗?【参考方案3】:

data1 中的 test1 属于类因子,而 data2 中的 test1 属于数字类。组合因子类和数值类会导致此问题。解决方案要么将 data1 和 data2 中的 test1 转换为因子,然后使用all_data &lt;- dplyr::bind_rows(data1,data2)

data.table::rbindlist(data1,data2)

【讨论】:

以上是关于bind_rows_(x, .id) 中的错误:无法将列从因子转换为数字的主要内容,如果未能解决你的问题,请参考以下文章

将list的索引添加到bind_rows?

R语言dplyr包使用bind_rows函数纵向合并两个dataframe(行生长)使用bind_cols函数横向合并两个dataframe(列生长)

忽略插入错误

Django filter(icontains).extra 产生错误的 SQL 语法(无引号)

全网首发:Undefined symbols for architecture x86_64: “std::__1::locale::use_facet(std::__1::locale::id&am

Python 解释器错误,x 不带参数(给定 1)