用fread()读取后无法对数据帧进行子集化

Xia*_*iao 2 r subset data.table

我正在尝试对名为的表进行子集化cars,如下所示.我不希望Country我的子表中的列,所以我曾经[,-1]删除第一列,但它将我的新变量分配cars.use-1.这里发生了什么?

> library(data.table)
> cars <- fread('cars.csv', header = TRUE)
> typeof(cars)
[1] "list"
> head(cars)
Country                       Car  MPG Weight Drive_Ratio Horsepower Displacement Cylinders
1:    U.S.        Buick Estate Wagon 16.9  4.360        2.73        155          350         8
2:    U.S. Ford Country Squire Wagon 15.5  4.054        2.26        142          351         8
3:    U.S.        Chevy Malibu Wagon 19.2  3.605        2.56        125          267         8
4:    U.S.    Chrysler LeBaron Wagon 18.5  3.940        2.45        150          360         8
5:    U.S.                  Chevette 30.0  2.155        3.70         68           98         4
6:   Japan             Toyota Corona 27.5  2.560        3.05         95          134         4
> cars.use <- cars[,-1]
> cars.use
[1] -1
Run Code Online (Sandbox Code Playgroud)

akr*_*run 7

通过使用fread,我们得到了一个data.table.要集,一个data.table, with=FALSE都可以使用.

cars[,-1, with=FALSE]
Run Code Online (Sandbox Code Playgroud)

它描述于 ?data.table

默认情况下,= TRUE,j在x的帧内计算; 列名可以用作变量.当with = FALSE时,j是列名的字符向量或要选择的列位置的数字向量,返回的值始终是data.table.with = FALSE在data.table中通常很有用,可以动态选择列.

数据

 cars <- data.table(Col1= 1:5, Col2= 6:10)
Run Code Online (Sandbox Code Playgroud)


Ric*_*ven 6

您可以在通话中解决此问题fread().

如果您将fread()呼叫更改为按名称(或按编号)删除第一列,则读取时将跳过该列.

fread("cars.csv", drop = "Country", header = TRUE)
Run Code Online (Sandbox Code Playgroud)

您在子集化方面遇到问题的原因是因为默认情况下fread()返回数据.如果需要数据,请将data.table参数更改为FALSE.

cars <- fread("cars.csv", header = TRUE, data.table = FALSE)
Run Code Online (Sandbox Code Playgroud)

现在我们有了一个数据框,cars[,-1]您使用的代码将起作用.如果要删除列并返回数据框,请将这两者结合起来.

fread("cars.csv", drop = "Country", header = TRUE, data.table = FALSE)
Run Code Online (Sandbox Code Playgroud)

有关help(fread)详细信息,请参阅