代码之家  ›  专栏  ›  技术社区  ›  Varun

如果向量中有列名,则从数据帧中删除列

r
  •  0
  • Varun  · 技术社区  · 5 年前

    我熟悉如何从R数据帧(或矩阵)中提取列,如下所示:

    df.2 <- df[, c("name1", "name2", "name3")]
    

    但是一个人能用一个 ! 或其他要选择的工具 ?

    • 使用短得多的 df.2 <- df[, c(1,3,5)]

    我试过:

    df.2 <- df[, !c("name1", "name2", "name3")]
    df.2 <- df[, !=c("name1", "name2", "name3")]
    

    就在我打这个的时候,我发现这个很管用:

    df.2 <- df[, !names(df) %in% c("name1", "name2", "name3")]
    

    有没有比上一个更好的办法?

    0 回复  |  直到 12 年前
        1
  •  34
  •   Prasad Khode    8 年前

    替代品 grep which :

    df.2 <- df[, -which(names(df) %in% c("name1", "name2", "name3"))]
    
        2
  •  12
  •   IRTFM    12 年前

    df.2 <- df[, -grep("^name[1:3]$", names(df) )] 
    

    因为grep返回数字,所以可以使用负向量索引来删除列。您可以添加更多或更复杂的模式。

        3
  •  9
  •   sbha    6 年前

    dplyr::select() 有几个用于删除特定列的选项:

    library(dplyr)
    
    drop_columns <- c('cyl','disp','hp')
    mtcars %>% 
      select(-one_of(drop_columns)) %>% 
      head(2)
    
                  mpg drat    wt  qsec vs am gear carb
    Mazda RX4      21  3.9 2.620 16.46  0  1    4    4
    Mazda RX4 Wag  21  3.9 2.875 17.02  0  1    4    4
    

    否定特定的列名后,下面将删除列“hp”以及从“qsec”到“gear”的列:

    mtcars %>% 
      select(-hp, -(qsec:gear)) %>% 
      head(2)
    
                  mpg cyl disp drat    wt carb
    Mazda RX4      21   6  160  3.9 2.620    4
    Mazda RX4 Wag  21   6  160  3.9 2.875    4
    

    你也可以否定 contains() starts_with() , ends_with() ,或 matches() :

    mtcars %>% 
      select(-contains('t')) %>%
      select(-starts_with('a')) %>% 
      select(-ends_with('b')) %>% 
      select(-matches('^m.+g$')) %>% 
      head(2)
    
                  cyl disp  hp  qsec vs gear
    Mazda RX4       6  160 110 16.46  0    4
    Mazda RX4 Wag   6  160 110 17.02  0    4
    
        4
  •  4
  •   mflo-ByeSE    7 年前

    df.2 <- subset(df, select=-c(name1, name2, name3))
    

    这是张贴在另一个类似的线程(虽然我现在找不到它)。在您描述的情况下应该是可持续的代码,并且可能比其他一些选项更容易阅读和编辑。

        5
  •  2
  •   Tyler Rinker DaniM    12 年前

    rm.col <- function(df, ...) {
        x <- substitute(...())
        z <- Trim(unlist(lapply(x, function(y) as.character(y))))
        df[, !names(df) %in% z]
    }
    
    rm.col(mtcars, hp, mpg)
    

    ... 是要删除的任何列的名称。

        6
  •  0
  •   Ahmed Osman    9 年前