rbind函数改变我的条目

时间:2012-08-02 21:01:01

标签: r

我有两个我想要一起追加的data.frames。一个data.frame保存过去的数据,另一个data.frame保存未来的预计数据。例如:

past <- structure(list(Period = c("2010-01-01", "2010-02-01", "2010-03-01", 
  "2010-04-01", "2010-05-01", "2010-06-01"), Count = c(3379221317, 
  3379221317, 3791458246, 4182424930, 4891432401, 5116360744)),
 .Names = c("Period", "Count"), row.names = c(NA, 6L), class = "data.frame")

future <- structure(list(Period = structure(c(15522, 15553, 15584, 15614, 
  15645, 15675), class = "Date"), Count = c(11051746713.9419, 11385578654.4160, 
  10864084232.2216, 11336164255.3271, 11121729107.9691, 12321341701.3780)),
  .Names = c("Period", "Count"), row.names = c(NA, 6L), class = "data.frame")

我使用了rbind(past,future),由于某种原因,Period data.frame中的future条目都被重命名。它看起来像:

> rbind(past,future)
       Period       Count
1  2010-01-01  3379221317
2  2010-02-01  3379221317
3  2010-03-01  3791458246
4  2010-04-01  4182424930
5  2010-05-01  4891432401
6  2010-06-01  5116360744
7       15522 11051746714
8       15553 11385578654
9       15584 10864084232
10      15614 11336164255
11      15645 11121729108
12      15675 12321341701

为什么我的日期会重命名为随机数?

2 个答案:

答案 0 :(得分:4)

dput(past)的输出中可以看出,past$Period是字符,而不是日期。 str(past)str(future)会告诉你他们与众不同。

> str(past)
'data.frame':   6 obs. of  2 variables:
 $ Period: chr  "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" ...
 $ Count : num  3.38e+09 3.38e+09 3.79e+09 4.18e+09 4.89e+09 ...
> str(future)
'data.frame':   6 obs. of  2 variables:
 $ Period: Date, format: "2012-07-01" "2012-08-01" ...
 $ Count : num  1.11e+10 1.14e+10 1.09e+10 1.13e+10 1.11e+10 ...

data.frame列中的所有元素必须是相同的类型,因此future$Period列会被转换...不确定为什么它无法正确转换,因为:

> as.character(future$Period)
[1] "2012-07-01" "2012-08-01" "2012-09-01" "2012-10-01"
[5] "2012-11-01" "2012-12-01"

所以解决方案是

  1. future$Period隐藏为角色:future$Period <- as.character(future$Period)
  2. 隐蔽past$Period到日期:past$Period <- as.Date(past$Period)
  3. 取决于您所需的输出。

答案 1 :(得分:3)

它们不是随机的。矩阵元素必须没有属性,因此如果强制转换为矩阵,则因子,Dates和POSIXt项将成为其数字表示。有rbind.data.frame,但您显然提供了rbind一个对象,该对象最终调用该函数的非data.frame版本。您需要从两个参数中提供dput()以获得更好的答案。