在R中按名称删除列

时间:2017-12-03 16:04:30

标签: r dataframe slice

所以我的数据框架结构如下:

> head(peakQ)
  STATION_NUMBER DATA_TYPE YEAR PEAK_CODE PRECISION_CODE MONTH DAY HOUR MINUTE TIME_ZONE  PEAK SYMBOL
1        05EE006         Q 1983         H             NA     6  29    5     18       MST 1.980       
2        05EE006         Q 1985         H             NA     4   2    0      0       MST 1.380      B
3        05EE006         Q 1986         H             NA     3  30   13     37       MST 2.640       
4        05EE006         Q 1987         H             NA     4   5   21      2       MST 1.590      B
5        05EE006         Q 1989         H             NA    10  22    2     45       MST 0.473       
6        05EE006         Q 1990         H             NA     4   2    4      2       MST 1.470       

我想删除列; STATION_NUMBER,DATA_TYPE,PEAK_CODE,PRECISION_CODE

但是,我想假设我只知道列名而不是索引。

我已经知道使用索引很简单,例如:

> head(peakQ[, -c(1, 2, 4, 5)])
  YEAR MONTH DAY HOUR MINUTE TIME_ZONE  PEAK SYMBOL
1 1983     6  29    5     18       MST 1.980       
2 1985     4   2    0      0       MST 1.380      B
3 1986     3  30   13     37       MST 2.640       
4 1987     4   5   21      2       MST 1.590      B
5 1989    10  22    2     45       MST 0.473       
6 1990     4   2    4      2       MST 1.470       

但是,为什么我使用列名称会出错?什么是变通方法?

> head(peakQ[, -c("STATION_NUMBER", "DATA_TYPE", "PEAK_CODE", "PRECISION_CODE")])
Error in -c("STATION_NUMBER", "DATA_TYPE", "PEAK_CODE", "PRECISION_CODE") : 
  invalid argument to unary operator

我特别困惑,因为相反的操作效果很好。

> head(peakQ[, c("STATION_NUMBER", "DATA_TYPE", "PEAK_CODE", "PRECISION_CODE")])
  STATION_NUMBER DATA_TYPE PEAK_CODE PRECISION_CODE
1        05EE006         Q         H             NA
2        05EE006         Q         H             NA
3        05EE006         Q         H             NA
4        05EE006         Q         H             NA
5        05EE006         Q         H             NA
6        05EE006         Q         H             NA

感谢任何帮助和/或更深入的解释。

2 个答案:

答案 0 :(得分:3)

字符向量上没有减号运算符;但是,subset尝试使用未评估名称的向量来模拟这一点。同上dplyr select。我们也可以使用setdiff来避免使用减号运算符。

1)子集使用subset参数尝试select=

subset(peakQ, select = - c(STATION_NUMBER, DATA_TYPE, PEAK_CODE, PRECISION_CODE))

2)setdiff 另一种可能性是:

peakQ[setdiff(names(peakQ), c("STATION_NUMBER","DATA_TYPE","PEAK_CODE","PRECISION_CODE"))]

3)dplyr 也可以使用dplyr软件包select

library(dplyr)
peakQ %>%
      select(- c(STATION_NUMBER, DATA_TYPE, PEAK_CODE, PRECISION_CODE))

答案 1 :(得分:1)

似乎“exclude”运算符仅适用于索引而不适用于列名。解决此问题的补救措施可能是使用%in%对列名称进行子集化!操作符:

> cols <- letters[1:5]
> cols
[1] "a" "b" "c" "d" "e"
> df1 <- as.data.frame(do.call(cbind, rep(list(1:5), 5)))
> names(df1) <- cols
> df1
  a b c d e
1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3 3 3
4 4 4 4 4 4
5 5 5 5 5 5
> df1[,-c("a","b")]
Error in -c("a", "b") : invalid argument to unary operator
> df1[,!names(df1) %in% c("a","b")]
  c d e
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5