2014-08-29 45 views
1

比方说,我们有像子集与矢量指定colums下降

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

'子集(DF,选择= -xtfrm(rows_to_select))' – rawr 2014-08-29 21:16:00

+0

@rawr似乎即不与'rows_to_select <工作 - C( “COLB”, “COLC”)' – MrFlick 2014-08-30 00:01:49

+0

亚..你需要'rows_to_select < - factor(c(“colB”,“colC”),levels = colnames(df))'如果需要的话@MrFlick – rawr 2014-08-30 02:07:08

回答

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子集S是也比调用subset()更有效。但是,为了满足您的

问题,为什么我不能简单地通过将一减去前

,这只是的r语言结构的结果反转保标志。

+0

效率更高意味着更快? – MERose 2014-08-30 21:17:17

2

您将无法对字符向量使用减号。但是你可以使用数字索引向量。此外,使用[类型的子集将会更好。

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

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

为什么这更好?速度更快吗? – MERose 2014-08-30 21:14:44

+0

@ user3621464 - 这不是更好,更糟糕。他们的时间差不多。我只是想指出为什么你在字符向量上存在负向索引问题。 – 2014-08-30 21:25:26

+0

对不起,我不够精确。我提到你的部分“你会更好的使用[类型子集。”为什么我最好使用'['而不是'$'? – MERose 2014-09-13 09:24:04

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