具有混合数据类型的数据框

时间:2013-04-15 21:59:11

标签: r type-conversion dataframe

我一直在使用R一段时间,但我仍然在努力研究因素和数据框架。 这是我的问题。

我正在尝试预先分配由多个不同类型的列组成的数据框,如下所示:

cb <- data.frame(S=character(1000), I=numeric(1000), A=as.Date(rep(0,1000), origin = "1900-01-01"), SD=as.POSIXct(rep(0,1000), origin = "1900-01-01 00:00:00"), CC=numeric(1000), stringsAsFactors=FALSE)

满足我想要的数据帧类型(str(cb)的输出):

'data.frame':   1000 obs. of  5 variables:
 $ S : chr  "" "" "" "" ...
 $ I : num  0 0 0 0 0 0 0 0 0 0 ...
 $ A : Date, format: "1900-01-01" "1900-01-01" "1900-01-01" "1900-01-01" ...
 $ SD: POSIXct, format: "1900-01-01" "1900-01-01" "1900-01-01" "1900-01-01" ...
 $ CC: num  0 0 0 0 0 0 0 0 0 0 ...

当我在数据框中分配第一项时,CC和I成为字符:

cb[1, ] <- c("ABCD", 4, "2005-12-12", "2008-04-03 20:30", 3)

str(cb)的输出:

'data.frame':   1000 obs. of  5 variables:
 $ S : chr  "ABCD" "" "" "" ...
 $ I : chr  "4" "0" "0" "0" ...
 $ A : Date, format: "2005-12-12" "1900-01-01" "1900-01-01" "1900-01-01" ...
 $ SD: POSIXct, format: "2008-04-03 20:30:00" "1900-01-01 00:00:00" "1900-01-01 00:00:00" "1900-01-01 00:00:00" ...
 $ CC: chr  "3" "0" "0" "0" ...

这使我的目的无法使用。

当我在data.frame定义中省略stringsAsFactors = FALSE时,我(显然)得到一个不同的错误消息(将警告设置为2):

Error in `[<-.factor`(`*tmp*`, iseq, value = "ABCD") : 
  (converted from warning) invalid factor level, NAs generated

我理解,但我不确定如何克服。

我做错了什么?如何确保保留列I和SD的数字类型? 非常感谢你的帮助。

干杯

1 个答案:

答案 0 :(得分:9)

您不能在矢量中混合类型,因此您的矢量被强制转换为角色。

R> c("ABCD", 4, "2005-12-12", "2008-04-03 20:30", 3)
[1] "ABCD"             "4"               
[3] "2005-12-12"       "2008-04-03 20:30"
[5] "3"

[<-.data.frame然后将data.frame的数字列强制转换为字符,因此该列将是一种类型;虽然我发现它有点不一致,它也没有将Date / POSIXt字段转换为字符......

您可以在列表中混合使用类型。此替换有效,因为data.frames是下面的列表。

cb[1, ] <- list("ABCD", 4, "2005-12-12", "2008-04-03 20:30", 3)

稍后回顾一下代码时,用一行data.frame替换data.frame的一行可能更有意义。

cb[1, ] <- data.frame("ABCD", 4, "2005-12-12", "2008-04-03 20:30", 3,
                      stringsAsFactors=FALSE)