gpt4 book ai didi

r - 防止 fread() 中的列类推断

转载 作者:行者123 更新时间:2023-12-03 22:19:44 25 4
gpt4 key购买 nike

fread有办法吗?模仿 read.table 的行为由此class变量的值由读入的数据设置。

我有数字数据,在主要数据下方有一些注释。当我使用 fread为了读入数据,列被转换为字符。但是,通过设置 nrow在 read.table` 中,我可以阻止这种行为。这在 fread.h 中可能吗? (我不想更改原始数据或制作修改后的副本)。谢谢

一个例子

d <- data.frame(x=c(1:100, NA, NA, "fff"), y=c(1:100, NA,NA,NA)) 
write.csv(d, "test.csv", row.names=F)

in_d <- read.csv("test.csv", nrow=100, header=T)
in_dt <- data.table::fread("test.csv", nrow=100)

其中产生
> str(in_d)
'data.frame': 100 obs. of 2 variables:
$ x: int 1 2 3 4 5 6 7 8 9 10 ...
$ y: int 1 2 3 4 5 6 7 8 9 10 ...
> str(in_dt)
Classes ‘data.table’ and 'data.frame': 100 obs. of 2 variables:
$ x: chr "1" "2" "3" "4" ...
$ y: int 1 2 3 4 5 6 7 8 9 10 ...
- attr(*, ".internal.selfref")=<externalptr>

作为一种解决方法,我认为我可以使用 read.table在一行中阅读,获取类并设置 colClasses ,但我误解了。
cl <- read.csv("test.csv", nrow=1,  header=T)
cols <- unname(sapply(cl, class))
in_dt <- data.table::fread("test.csv", nrow=100, colClasses=cols)
str(in_dt)

使用 Windows8.1
R 版本 3.1.2 (2014-10-31)
平台:x86_64-w64-mingw32/x64(64位)

最佳答案

选项 1:使用系统命令
fread()允许在其第一个参数中使用系统命令。我们可以使用它来删除文件第一列中的引号。

indt <- data.table::fread("cat test.csv | tr -d '\"'", nrows = 100)
str(indt)
# Classes ‘data.table’ and 'data.frame': 100 obs. of 2 variables:
# $ x: int 1 2 3 4 5 6 7 8 9 10 ...
# $ y: int 1 2 3 4 5 6 7 8 9 10 ...
# - attr(*, ".internal.selfref")=<externalptr>

系统命令 cat test.csv | tr -d '\"' 解释:
  • cat test.csv读取文件到标准输出
  • |是一个管道,使用前一个命令的输出作为下一个命令的输入
  • tr -d '\"'从当前输入
  • 中删除( -d )所有出现的双引号( '\"' )


    选项 2:阅读后的胁迫

    由于选项 1 似乎不适用于您的系统,另一种可能性是像您一样读取文件,但转换 x列与 type.convert() .
    library(data.table)
    indt2 <- fread("test.csv", nrows = 100)[, x := type.convert(x)]
    str(indt2)
    # Classes ‘data.table’ and 'data.frame': 100 obs. of 2 variables:
    # $ x: int 1 2 3 4 5 6 7 8 9 10 ...
    # $ y: int 1 2 3 4 5 6 7 8 9 10 ...
    # - attr(*, ".internal.selfref")=<externalptr>

    旁注:我通常更喜欢使用 type.convert()as.numeric()避免在某些情况下触发“强制引入的 NA”警告。例如,
    x <- c("1", "4", "NA", "6")
    as.numeric(x)
    # [1] 1 4 NA 6
    # Warning message:
    # NAs introduced by coercion
    type.convert(x)
    # [1] 1 4 NA 6

    但当然你可以使用 as.numeric()以及。

    注:这个答案假设 data.table dev v1.9.5

    关于r - 防止 fread() 中的列类推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29499145/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com