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)
通过使用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)
您可以在通话中解决此问题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)详细信息,请参阅