假设我们有一个像
这样的简单数据框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)
?
答案 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语言结构的结果。