用于回收布尔索引以供选择的R-原理

时间:2016-11-04 09:31:10

标签: r indexing dataframe boolean subset

标题是自我解释。我想知道为什么R选择回收布尔值进行选择/子集化? "["州的文档Such vectors are recycled if necessary to match the corresponding extent. i, j

这样做有什么好处吗?我可以想到下面提到的一个,但我认为缺点可能超过易用性的好处。

df<- data.frame(C1=1:10,c2=101:110) 
class(unclass(df)[1]) # df is a list of two lists, each a column of df
df
df[1] # selects 1st list (ie, first column)
df[2]

# However, indices are recycled if we use Logical indices
df[TRUE] # selects both columns
df[c(T,T),] # recycled row indices
df[c(T,T,F),] # recycled row indices
df[FALSE] 

# This can actually lead to inadvertent errors
# For example, this has only 7 index elements instead of 10, 
# but it's quite possible to miss out on the fact that these are being recycled
df[c(T,F,T,T,F,F,F),]

我能想到的这种回收功能的唯一用途是skipping alternate rows

df[c(T,F),]

提出这个问题的背景是我昨天在SO上看到的另一个问题。它后来被删除,因为有人指出了|||之间的差异e。我想知道他们是否意识到他们也在处理回收问题。

   # An erronous use of &&  can land you in soup too
   df [df$C1 >0 && df$c2 <102, ] #returns TRUE, will select all rows

还有其他众所周知的陷阱,应该警惕吗?

1 个答案:

答案 0 :(得分:1)

优点:

允许您选择向量或data.frame或矩阵中的每个第n行或每列:

> m <- matrix(1:20, 4)
> m[c(TRUE,FALSE), ]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    3    7   11   15   19
> m[, c(TRUE,FALSE) ]
     [,1] [,2] [,3]
[1,]    1    9   17
[2,]    2   10   18
[3,]    3   11   19
[4,]    4   12   20

每三栏:

> m[, c(TRUE,FALSE,FALSE) ]
     [,1] [,2]
[1,]    1   13
[2,]    2   14
[3,]    3   15
[4,]    4   16

引用的缺点实际上是&&运算符的错误使用(我认为你确实意识到了)。该运算符仅返回长度为1的向量,并且在尝试进行索引时通常是不合适的。这可能是使用||运算符的提问者所表现出来的混乱。

最终答案是因为作者喜欢这样。 R是S的大部分语义中的克隆,它是围绕着AT&amp; T智库中高级语言的曙光而构建的。