在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) 子集 尝试使用 subsetselect= 参数:

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中按名称删除列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 LINQ 中按特定列分组 [重复]

如何在 R 中读取具有重复列的羽毛文件

如何在保留列表名称和值的同时展平一列列表? [r] [重复]

在用户表中按名称查找列

如何在java中按名称获取组件[重复]

R的read.csv在第一列名称前加上垃圾文本[重复]