8

我使用 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和我变成了字符:

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 列的数字类型?非常感谢你的帮助。

干杯

4

1 回答 1

10

您不能在向量中混合类型,因此您的向量被强制转换为字符。

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 的一行替换为 1 行 data.frame 可能更有意义:

cb[1, ] <- data.frame("ABCD", 4, "2005-12-12", "2008-04-03 20:30", 3,
                      stringsAsFactors=FALSE)
于 2013-04-15T22:03:59.820 回答