所以我的数据框架结构如下:
> 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
感谢任何帮助和/或更深入的解释。
答案 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