bdu*_*bdu 5 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)
Run Code Online (Sandbox Code Playgroud)
它满足我想要的数据帧类型(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 ...
Run Code Online (Sandbox Code Playgroud)
当我在数据框中分配第一个项目时,CC和I成为字符:
cb[1, ] <- c("ABCD", 4, "2005-12-12", "2008-04-03 20:30", 3)
Run Code Online (Sandbox Code Playgroud)
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" ...
Run Code Online (Sandbox Code Playgroud)
这使得我的目的无法使用.
当我在data.frame定义中省略stringsAsFactors = FALSE时,我(显然)得到一个不同的错误消息(已将警告设置为2):
Error in `[<-.factor`(`*tmp*`, iseq, value = "ABCD") :
(converted from warning) invalid factor level, NAs generated
Run Code Online (Sandbox Code Playgroud)
我理解,但我不知道如何克服.
我究竟做错了什么?如何确保保留列I和SD的数字类型?非常感谢你的帮助.
干杯
乙
您不能在向量中混合类型,因此您的向量将被强制转换为字符.
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"
Run Code Online (Sandbox Code Playgroud)
[<-.data.frame然后将data.frame的数字列强制转换为字符,因此该列将是一种类型; 虽然我发现它有点不一致,它也没有将Date/POSIXt字段转换为字符......
您可以在列表中混合类型.此替换有效,因为data.frames是下面的列表.
cb[1, ] <- list("ABCD", 4, "2005-12-12", "2008-04-03 20:30", 3)
Run Code Online (Sandbox Code Playgroud)
当您稍后回顾代码时,将data.frame的一行替换为1行data.frame可能更有意义:
cb[1, ] <- data.frame("ABCD", 4, "2005-12-12", "2008-04-03 20:30", 3,
stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)