【问题标题】:Cannot subset data frame after reading with fread()使用 fread() 读取后无法子集数据帧
【发布时间】:2016-01-03 16:32:29
【问题描述】:

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

【问题讨论】:

  • 一旦你学会了使用 data.table 会更快更好。由于您已经在使用 fread,我猜您知道这比使用 read.table 快得多。因此,要删除 data.table 语言中的列,您可以使用以下命令:cars[ , Country := NULL]。 (另请参阅下面的@akrun 评论)
  • 仅供参考,您大部分时间都希望使用class(cars) 而不是typeof(cars)

标签: r data.table subset


【解决方案1】:

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

cars[,-1, with=FALSE]

?data.table中有描述

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

数据

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

【讨论】:

    【解决方案2】:

    您可以致电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)

    【讨论】:

      【解决方案3】:

      一个选项是将您的所有列 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
      

      【讨论】:

      • 由于 OP 正在处理data.table,如果我们想将第 2 列和第 3 列更改为 NULL setDT(df)[, 2:3 := NULL]
      猜你喜欢
      • 2016-08-24
      • 2015-10-19
      • 1970-01-01
      • 2015-02-11
      • 2022-01-07
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 2012-05-14
      相关资源
      最近更新 更多