希望我不会重复以前存在的一些问题。我正在使用32位Win7机器,R V = 3.2.0,dplyr V = 0.4.1,RStudio 0.98.1103。
有问题的文件是两个读入vars(x,y / sep =“|”,header = TRUE,stringsasFactors = FALSE)的CSV文件,它们来自同一个Oracle表。用于生成两个文件的查询提取了完全相同的变量(29)。
identical(names(x), names(y) > TRUE
但是,当我加载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
我查看了列'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
.. ... ... ... ...
> identical(sapply(x, class), sapply(y, class))
[1] FALSE
> class(x$rmnumber);class(y$rmnumber)
[1] "integer"
[1] "character"
我无法弄清楚为什么他们是不同的。信息来自完全相同的表,并使用完全相同的代码将它们读入变量。
锁定解决方案
非常感谢@Pascal帮助我解决这个问题。简单的数据类型转换解决了我的问题:
y$rmnumber <- as.integer(y$rmnumber)
> dat2 <- bind_rows(x,y)
> dat2
Source: local data frame [99,884 x 24]
答案 0 :(得分:8)
错误消息表明:&#34;在一个data.frame中,&#39; rmnumber&#39;在类整数和其他data.frame中,&#39; rmnumber&#39;属于阶级因素。我无法将不同的类绑定在一起#34;。
让我们使用你的例子
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"))
我们检查&#34; x.df&#34;的每一列的课程。和&#34; y.df&#34;:
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"
一切都很好,data.frames之间的类是一致的。现在,让我们来看看&#34; y.df $ rmnum&#34;成因素:
y.df$rmnum <- factor(y.df$rmnum)
class(y.df$rmnum)
# [1] "factor"
让我们现在尝试绑定:
bind_rows(x.df, y.df)
错误:不兼容的类型(数据索引:2,列:&#39; rmnum&#39;,正在收集:整数(dplyr :: Collecter_Impl&lt; 13&gt;),与类型的数据不兼容:factor
相同的错误消息。所以,在你的一个data.frame,&#39; rmnumber&#39;是整数,在另一个中,&#39; rmnumber&#39;是一个因素。你必须改变因素&#39; rmnumber&#39;整数,或相反。