dplyr中的bind_rows抛出异常错误

Zac*_*ach 8 r dplyr

希望我不会复制以前存在的一些问题.我正在使用32位Win7机器,RV = 3.2.0,dplyr V = 0.4.1,RStudio 0.98.1103.

有问题的文件是两个读入变量的CSV文件(x,y/sep ="|",header = TRUE,stringsasFactors = FALSE),它们来自同一个Oracle表.用于生成两个文件的查询提取了完全相同的变量(29).

identical(names(x), names(y) > TRUE
Run Code Online (Sandbox Code Playgroud)

但是,当我加载dplyr包并尝试使用'bind_rows'作为dat < - bind_rows(x,y)时,我收到以下错误:

> bind_rows(x,y)
Error: incompatible type (data index: 2, column: 'rmnumber', was collecting: integer (dplyr::Collecter_Impl<13>), incompatible with data of type: factor
In addition: Warning messages:
1: In rbind_all(list(x, ...)) :
  Unequal factor levels: coercing to character
2: In rbind_all(list(x, ...)) :
  Unequal factor levels: coercing to character
3: In rbind_all(list(x, ...)) :
  Unequal factor levels: coercing to character
Run Code Online (Sandbox Code Playgroud)

我查看了列'rmnumber'并验证了该列中的所有内容都是预期的数字或"NA",也与表中的NULL值一样.我也尝试了bind_rows(list(x,y))并返回了相同的错误.

原始"rbind"在这些变量上运行良好,没有明显的精度损失.

有没有人见过这个错误?除了使用rbind之外,你有什么潜在的解决方案吗?

谢谢!

#

我不认为这有用,但我构建了自己的dfs,当然'bind_rows'工作得非常完美:

> x.df <- data.frame(first_name = c("abc"), last_name = c("def"), rmnum = (1:15), addy = ("some_address"))
> y.df <- data.frame(first_name = c("abc"), last_name = c("def"), rmnum = (1:15), addy = ("some_address"))
> bind_rows(x.df, y.df)
Source: local data frame [30 x 4]

   first_name last_name rmnum         addy
1         abc       def     1 some_address
2         abc       def     2 some_address
3         abc       def     3 some_address
4         abc       def     4 some_address
5         abc       def     5 some_address
6         abc       def     6 some_address
7         abc       def     7 some_address
8         abc       def     8 some_address
9         abc       def     9 some_address
10        abc       def    10 some_address
..        ...       ...   ...          ...
Run Code Online (Sandbox Code Playgroud)

验证cols类

> identical(sapply(x, class), sapply(y, class))
[1] FALSE

> class(x$rmnumber);class(y$rmnumber)
[1] "integer"
[1] "character"
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚他们为什么不同.信息来自完全相同的表,并使用完全相同的代码将它们读入变量.

锁定解决方案

非常感谢@Pascal帮助我解决这个问题.简单的数据类型转换解决了我的问题:

    y$rmnumber <- as.integer(y$rmnumber)
> dat2 <- bind_rows(x,y)
> dat2
Source: local data frame [99,884 x 24]
Run Code Online (Sandbox Code Playgroud)

小智 8

错误消息说:"在一个data.frame中,'rmnumber'在类整数和其他data.frame中,'rmnumber'是类因子.我不能将不同的类绑定在一起".

让我们用你的例子

x.df <- data.frame(first_name = c("abc"), last_name = c("def"), rmnum = (1:15), addy = ("some_address"))
y.df <- data.frame(first_name = c("abc"), last_name = c("def"), rmnum = (1:15), addy = ("some_address"))
Run Code Online (Sandbox Code Playgroud)

我们检查"x.df"和"y.df"的每一列的类:

sapply(x.df, class)
# first_name  last_name      rmnum       addy 
#  "factor"   "factor"  "integer"   "factor" 


sapply(y.df, class)
# first_name  last_name      rmnum       addy 
#  "factor"   "factor"  "integer"   "factor" 
Run Code Online (Sandbox Code Playgroud)

一切都很好,data.frames之间的类是一致的.现在,让我们把"y.df $ rmnum"变成因素:

y.df$rmnum <- factor(y.df$rmnum)
class(y.df$rmnum)
# [1] "factor"
Run Code Online (Sandbox Code Playgroud)

我们现在尝试绑定:

bind_rows(x.df, y.df)
Run Code Online (Sandbox Code Playgroud)

错误:不兼容的类型(数据索引:2,列:'rmnum',正在收集:整数(dplyr :: Collecter_Impl <13>),与类型的数据不兼容:因素

相同的错误消息.因此,在你的一个data.frame中,'rmnumber'是整数,而在另一个中,'rmnumber'是一个因素.你必须把因子'rmnumber'变成整数,或者相反.

  • 要将因子转换为整数/数字:http://stackoverflow.com/a/3418192/3710546 (2认同)