如何删除数据框中特定列之前的所有列?

时间:2018-08-07 21:11:03

标签: r

我想删除指定列之前的所有列。

样本数据: 在mpg中,这些是按顺序排列的下列列名称:

names(mpg)

[1] "manufacturer", "model", "displ", "year", "cyl", "trans", "drv", "cty", 

[9] "hwy", "fl", "class"

说我想删除“ cyl”列之前的所有列,我会这样做:

mpg[-(1:4)]

但是在我的实际数据中,有时指定列(即cyl)之前的列数发生了变化。因此,有时总是有3列或7列,而不是总是在所需列(manufacturer, model, displ, year之前的4列(cyl)。

如何调整此代码,以确保包括“ cyl”之后的所有列?

2 个答案:

答案 0 :(得分:8)

您可以使用which来获取正确的索引和子集。您需要减去1,因为您不想删除cyl列。

如果您已经在使用tidyverse工具(由于您使用的是ggplot2中的示例数据集,这似乎很有可能),那么您也可以使用dplyr::select()tidyselect::last_col()如下。语法是,您可以使用colnamea:colnameb来引用列选择,列选择将是colnameacolnameb之间的所有列。 last_col是对数据框中最后一列的引用,因为我们无法自动知道此处的内容。

remove_up_to <- function(df, colname){
  col_i <- which(colnames(df) == colname) - 1
  df[-(1:col_i)]
}

library(tidyverse)
remove_up_to(mpg, "cyl")
#> # A tibble: 234 x 7
#>      cyl trans      drv     cty   hwy fl    class  
#>    <int> <chr>      <chr> <int> <int> <chr> <chr>  
#>  1     4 auto(l5)   f        18    29 p     compact
#>  2     4 manual(m5) f        21    29 p     compact
#>  3     4 manual(m6) f        20    31 p     compact
#>  4     4 auto(av)   f        21    30 p     compact
#>  5     6 auto(l5)   f        16    26 p     compact
#>  6     6 manual(m5) f        18    26 p     compact
#>  7     6 auto(av)   f        18    27 p     compact
#>  8     4 manual(m5) 4        18    26 p     compact
#>  9     4 auto(l5)   4        16    25 p     compact
#> 10     4 manual(m6) 4        20    28 p     compact
#> # ... with 224 more rows
mpg %>% select(cyl:tidyselect::last_col())
#> # A tibble: 234 x 7
#>      cyl trans      drv     cty   hwy fl    class  
#>    <int> <chr>      <chr> <int> <int> <chr> <chr>  
#>  1     4 auto(l5)   f        18    29 p     compact
#>  2     4 manual(m5) f        21    29 p     compact
#>  3     4 manual(m6) f        20    31 p     compact
#>  4     4 auto(av)   f        21    30 p     compact
#>  5     6 auto(l5)   f        16    26 p     compact
#>  6     6 manual(m5) f        18    26 p     compact
#>  7     6 auto(av)   f        18    27 p     compact
#>  8     4 manual(m5) 4        18    26 p     compact
#>  9     4 auto(l5)   4        16    25 p     compact
#> 10     4 manual(m6) 4        20    28 p     compact
#> # ... with 224 more rows

reprex package(v0.2.0)于2018-08-07创建。

答案 1 :(得分:3)

其他方法可能更快,更清晰。这是一个晦涩的方法:

    For i = 1 To olItems.Count
        Set olItem = olItems(i)
        If TypeOf olItem Is Outlook.MailItem Then
            Set olMail = olItem ' essentially a type cast from Object to MailItem
            ...
        End If
    Next