在R中按名称删除列[重复]
Posted
技术标签:
【中文标题】在R中按名称删除列[重复]【英文标题】:Dropping Columns by name in R [duplicate] 【发布时间】:2018-05-17 03:29:09 【问题描述】:所以我有一个结构如下的数据框:
> 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
感谢任何帮助和/或更深入的解释。
【问题讨论】:
【参考方案1】:字符向量上没有减号;但是,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))
【讨论】:
【参考方案2】:似乎“排除”运算符仅适用于索引而不适用于列名。克服此问题的一种补救措施可能是使用 %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
【讨论】:
请在回答之前寻找类似的qsns。 让我们说 Data 是您的数据集,您的 ColumnName 是 col 然后下面是命令。示例数据以上是关于在R中按名称删除列[重复]的主要内容,如果未能解决你的问题,请参考以下文章