【问题标题】:Removing a column from a matrix从矩阵中删除一列
【发布时间】:2018-02-12 13:13:46
【问题描述】:

我对 R 有点陌生,想从矩阵中删除该列的名称。我知道X[,2] 给出了第二列,X[,-2] 给出了除第二列之外的每一列。我真正想知道的是是否有使用列名的类似命令。我有一个矩阵并想删除“销售”列,但X[,-"sales"] 似乎对此不起作用。我该怎么做?我只会使用列号,以便以后能够将其用于其他具有不同维度的矩阵。任何帮助将不胜感激。

【问题讨论】:

  • X[,!colnames(X) %in% 'Sales']
  • 辛苦了,谢谢!
  • 也许只是X[, colnames(X) != 'Sales'] ?
  • @Moody_Mudskipper @Sotos 建议的方式更好,因为它可以轻松扩展以删除多个列,例如X[,!colnames(X) %in% c('Sales','other_col')]

标签: r matrix


【解决方案1】:

我不确定为什么所有答案都是针对数据框而不是矩阵的解决方案。

根据 @Sotos 和 @Moody_Mudskipper 的 cmets,这是一个带有内置 state.x77 数据矩阵的示例。

dat <- head(state.x77)
dat
#>            Population Income Illiteracy Life Exp Murder HS Grad Frost   Area
#> Alabama          3615   3624        2.1    69.05   15.1    41.3    20  50708
#> Alaska            365   6315        1.5    69.31   11.3    66.7   152 566432
#> Arizona          2212   4530        1.8    70.55    7.8    58.1    15 113417
#> Arkansas         2110   3378        1.9    70.66   10.1    39.9    65  51945
#> California      21198   5114        1.1    71.71   10.3    62.6    20 156361
#> Colorado         2541   4884        0.7    72.06    6.8    63.9   166 103766

# for removing one column
dat[, colnames(dat) != "Area"]
#>            Population Income Illiteracy Life Exp Murder HS Grad Frost
#> Alabama          3615   3624        2.1    69.05   15.1    41.3    20
#> Alaska            365   6315        1.5    69.31   11.3    66.7   152
#> Arizona          2212   4530        1.8    70.55    7.8    58.1    15
#> Arkansas         2110   3378        1.9    70.66   10.1    39.9    65
#> California      21198   5114        1.1    71.71   10.3    62.6    20
#> Colorado         2541   4884        0.7    72.06    6.8    63.9   166

# for removing more than one column
dat[, !colnames(dat) %in% c("Area", "Life Exp")]
#>            Population Income Illiteracy Murder HS Grad Frost
#> Alabama          3615   3624        2.1   15.1    41.3    20
#> Alaska            365   6315        1.5   11.3    66.7   152
#> Arizona          2212   4530        1.8    7.8    58.1    15
#> Arkansas         2110   3378        1.9   10.1    39.9    65
#> California      21198   5114        1.1   10.3    62.6    20
#> Colorado         2541   4884        0.7    6.8    63.9   166

#be sure to use `colnames` and not `names`
names(state.x77)
#> NULL

reprex package (v0.3.0) 于 2020 年 6 月 27 日创建

【讨论】:

    【解决方案2】:

    我最喜欢的方式:

    # create data
    df <- data.frame(x = runif(100),
                     y = runif(100),
                     remove_me = runif(100),
                     remove_me_too = runif(100))
    
    # remove column
    df <- df[,!names(df) %in% c("remove_me", "remove_me_too")]
    

    所以这个数据框:

    > df
                  x           y  remove_me remove_me_too
    1   0.731124508 0.535219259 0.33209113   0.736142042
    2   0.612017350 0.404128030 0.84923974   0.624543223
    3   0.415403559 0.369818154 0.53817387   0.661263087
    4   0.199780006 0.679946936 0.58782429   0.085624708
    5   0.343304259 0.892128112 0.02827132   0.038203599
    

    变成这样:

    > df
                  x           y
    1   0.731124508 0.535219259
    2   0.612017350 0.404128030
    3   0.415403559 0.369818154
    4   0.199780006 0.679946936
    5   0.343304259 0.892128112
    

    【讨论】:

      【解决方案3】:

      与 R 一样,有许多潜在的解决方案。您可以使用包dplyrselect() 轻松删除或选择数据框中的列。

      df <- data.frame(x = runif(100),
                       y = runif(100),
                       remove_me = runif(100),
                       remove_me_too = runif(100))
      
      library(dplyr)
      select(df, -remove_me, -remove_me_too) %>% head()
      #>            x           y
      #> 1 0.35113636 0.134590652
      #> 2 0.72545356 0.165608839
      #> 3 0.81000067 0.090696049
      #> 4 0.29882204 0.004602398
      #> 5 0.93492918 0.256870750
      #> 6 0.03007377 0.395614901
      

      您可以阅读更多关于dplyr 及其动词here. 的信息

      【讨论】:

        【解决方案4】:

        一般情况下,如果您删除了太多列而只剩下一列,R 会将其转换为数值向量。你可以通过设置drop = FALSE来阻止它。

        (df <- data.frame(x = runif(6),
                          y = runif(6),
                          remove_me = runif(6),
                          remove_me_too = runif(6)))
        #           x          y remove_me remove_me_too
        # 1 0.4839869 0.18672217 0.0973506    0.72310641
        # 2 0.2467426 0.37950878 0.2472324    0.80133920
        # 3 0.4449471 0.58542547 0.8185943    0.57900456
        # 4 0.9119014 0.12089776 0.2153147    0.05584816
        # 5 0.4979701 0.04890334 0.7420666    0.44906667
        # 6 0.3266374 0.37110822 0.6809380    0.29091746
        
        df[, -c(3, 4)]
        #           x          y
        # 1 0.4839869 0.18672217
        # 2 0.2467426 0.37950878
        # 3 0.4449471 0.58542547
        # 4 0.9119014 0.12089776
        # 5 0.4979701 0.04890334
        # 6 0.3266374 0.37110822
        
        # Result is a numeric vector
        df[, -c(2, 3, 4)]
        # [1] 0.4839869 0.2467426 0.4449471 0.9119014 0.4979701 0.3266374
        
        # Keep the matrix type
        df[, -c(2, 3, 4), drop = FALSE]
        #           x
        # 1 0.4839869
        # 2 0.2467426
        # 3 0.4449471
        # 4 0.9119014
        # 5 0.4979701
        # 6 0.3266374
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-22
          • 1970-01-01
          • 2012-09-05
          • 2019-07-08
          • 1970-01-01
          • 2020-01-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多