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

时间:2016-01-03 16:32:30

标签: r data.table subset

我正在尝试对名为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

3 个答案:

答案 0 :(得分:7)

使用fread,我们得到data.table。对于子集,可以使用data.tablewith=FALSE

cars[,-1, with=FALSE]

?data.table

中对此进行了描述
  

默认情况下为= TRUE,j在x的帧内进行评估;柱   名称可以用作变量。当= FALSE时j是一个字符   列名称的向量或列位置的数字向量   select,返回的值始终是data.table。 with = FALSE是   通常在data.table中有用,可以动态选择列。

数据

 cars <- data.table(Col1= 1:5, Col2= 6:10)

答案 1 :(得分:6)

您可以在致电fread()时解决此问题。

如果您更改fread()调用以按名称(或按数字)删除第一列,则会在阅读时跳过该列。

fread("cars.csv", drop = "Country", header = TRUE)

您遇到子集问题的原因是fread()默认返回数据。如果您需要数据框架,请将data.table参数更改为FALSE

cars <- fread("cars.csv", header = TRUE, data.table = FALSE)

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

fread("cars.csv", drop = "Country", header = TRUE, data.table = FALSE)

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

答案 2 :(得分:1)

一个选项是将所有列Country设置为NULL。这可以按如下方式完成:

# Create dataframe
df <- read.delim(text='
Country Car MPG Weight Drive_Ratio Horsepower Displacement Cylinders
U.S. BuickEstateWagon 16.9 4.360 2.73 155 350 8
U.S. FordCountrySquireWagon 15.5 4.054 2.26 142 351 8
U.S. ChevyMalibuWagon 19.2 3.605 2.56 125 267 8
U.S. ChryslerLeBaronWagon 18.5 3.940 2.45 150 360 8
U.S. Chevette 30.0 2.155 3.70 68 98 4
Japan ToyotaCorona 27.5 2.560 3.05 95 134 4', sep=' ')

#> df
#  Country                    Car  MPG Weight Drive_Ratio Horsepower
#1    U.S.       BuickEstateWagon 16.9  4.360        2.73        155
#2    U.S. FordCountrySquireWagon 15.5  4.054        2.26        142
#3    U.S.       ChevyMalibuWagon 19.2  3.605        2.56        125
#4    U.S.   ChryslerLeBaronWagon 18.5  3.940        2.45        150
#5    U.S.               Chevette 30.0  2.155        3.70         68
#6   Japan           ToyotaCorona 27.5  2.560        3.05         95
#  Displacement Cylinders
#1          350         8
#2          351         8
#3          267         8
#4          360         8
#5           98         4
#6          134         4

# Remove the 'Country' columns from the dataframe 
df$Country <- NULL

#> df
#                     Car  MPG Weight Drive_Ratio Horsepower Displacement
#1       BuickEstateWagon 16.9  4.360        2.73        155          350
#2 FordCountrySquireWagon 15.5  4.054        2.26        142          351
#3       ChevyMalibuWagon 19.2  3.605        2.56        125          267
#4   ChryslerLeBaronWagon 18.5  3.940        2.45        150          360
#5               Chevette 30.0  2.155        3.70         68           98
#6           ToyotaCorona 27.5  2.560        3.05         95          134
#  Cylinders
#1         8
#2         8
#3         8
#4         8
#5         4
#6         4