子集与向量指定要删除的列

时间:2014-08-29 20:52:45

标签: r subset

假设我们有一个像

这样的简单数据框
df <-read.table(text="
colA colB colC colD
1    2    3    4
5    6    7    8
",header=TRUE,sep="")

经常有人解释说,可以存储要保存在矢量本身中的列的名称:

rows_to_select <- c("colA", "colB")

使用subset(df, select=rows_to_select)进行子集会产生预期结果。

但为什么我不能简单地通过在前面放一个减号来反转保持符号,即subset(df, select=-rows_to_select)?它给出了错误Error in -keep : invalid argument to unary operator Calls: subset -> subset.data.frame -> eval -> eval

然而,subset(df, select=-c(colA, colB))有效。我是否总是必须使用setdiff,例如keep <- setdiff(names(df), rows_to_select)我可以subset(df, select=keep)

3 个答案:

答案 0 :(得分:2)

您将无法使用带有字符向量的减号。但是你可以使用带有数字索引向量的一个。此外,您最好使用[ - 类型子集。

要获取索引,我们可以使用which

> rows <- c("colA", "colB")
> df[, -which(names(df) %in% rows)]
#   colC colD
# 1    3    4
# 2    7    8

答案 1 :(得分:1)

dplyr包提供了分组数据的方式。

v1 <- 1:10
v2 <- 11:20
v3 <- rep(c("ana", "bob"), each = 5)
v4 <- letters[1:10]

foo <- data.frame(v1,v2,v3, v4, stringsAsFactors=F)

# Remove column v2 and v3
select(foo, -c(v2:v3))

#   v1 v4
#1   1  a
#2   2  b
#3   3  c
#4   4  d
#5   5  e
#6   6  f
#7   7  g
#8   8  h
#9   9  i
#10 10  j

答案 2 :(得分:0)

您可以通过几种不同的方式完成此任务,并且您不仅限于subset功能。例如,

Df <- data.frame(
  colA=1:4,
  colB=5:8,
  colC=9:12,
  colD=13:16)
##
rows_to_select <- c("colA", "colB")
##
> Df[,!(names(Df) %in% rows_to_select)]
  colC colD
1    9   13
2   10   14
3   11   15
4   12   16

使用data.frame子集[也比调用subset()更有效。但要解决你的问题

  

为什么我不能通过在前面添加一个减号来反转保持符号

这只是R语言结构的结果。