【问题标题】:R after replacing read.csv with fread incorrect number of dimensions error appears用 fread 替换 read.csv 后的 R 出现不正确的维数错误
【发布时间】:2016-11-24 13:10:15
【问题描述】:

我正在加载我的 csv 文件:

baseData <- read.csv(datafile)

但由于我想加载更大的数据集,我已移至 data.table package

baseData <- fread(input = paste("zcat < ", datafile, sep=""))

似乎一切正常,数据加载速度更快,但是当我点击以下行时:

d <- baseData[baseData$some_prop==0,]
d <- d[!is.na(d[,"col"]) & (d[,"col"] == 0 | d[,"col"] == 1),]

incorrect number of dimensions 出现错误

使用read.csv 时一切正常。 知道会出什么问题吗?

【问题讨论】:

  • 如果 dvName 是您的列,那么它应该用引号括起来 d[,"dvName"]
  • 感谢@Arunkumarmahesh,但它是一个变量 - 我编辑了这个问题。
  • 将 col 转换为数字并尝试一次希望它可以工作
  • 感谢@Arunkumarmahesh,但该列的内容已经是数字了。还是你的意思是别的?
  • fread 有一个 data.table 参数,您可以将其设置为 FALSE,因此您将获得 data.frame 而不是 data.table

标签: r csv data.table


【解决方案1】:

在 data.table 中,子集的 j 部分旨在返回一个新值,并且不应引用列名,否则您将得到该值。

例子:

>d<-data.table(A=1:5,B=5:10)
> d[,A]
[1] 1 2 3 4 5 1
> d[,B]
[1]  5  6  7  8  9 10
> d[,"B"]
[1] "B"

因此,对于您的特殊情况,删除列名周围的引号应该可以解决错误。

如果您的代码很长并且使用data.frame 方法,您可以使用setDF(d) 使其在重构之前按原样运行。

完整地说,出现错误是因为您的逻辑语句的长度为 1("col" == whatever 只返回一个值 TRUE 或 FALSE),与 data.table 对象的行数不匹配。

【讨论】:

  • 谢谢!我想我现在更接近了!在测试完东西后,我遇到了以下行: d
  • @GuyDubrovski 可能,data.tables 有一个很好的功能,可以通过引用更新自己,所以当你像在 data.frame 中那样进行这种重新分配时,它会变得很糟糕:)
  • @GuyDubrovski setDF 不是setDT,想法是将数据集再次转换为data.frame。
  • @GuyDubrovski 我仍然建议您深入研究 data.table 并查看您的实际代码,您可能会通过参考 data.table 更新来大大加快速度
  • DT[, "B"] 的行为随着今天 1.9.8 的发布而改变,其变更日志/新闻中的第 3 项:github.com/Rdatatable/data.table/blob/master/NEWS.md
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
相关资源
最近更新 更多