当在R中进行子集化时,有必要包括`which`或者我可以进行逻辑测试吗?

And*_*son 6 r subset which

假设我有一个数据框,df并希望根据列a的值对其进行子集化.

df <- data.frame(a = 1:4, b = 5:8)
df
Run Code Online (Sandbox Code Playgroud)

是否有必要which在括号中包含一个函数,还是只包括逻辑测试?

df[df$a == "2",]
#  a b
#2 2 6
df[which(df$a == "2"),]
#  a b
#2 2 6
Run Code Online (Sandbox Code Playgroud)

看起来两种方式都是一样的...我在一个大型数据框中得到了一些奇怪的结果(即返回空行以及正确的行)但是一旦我清理了环境并重新编写了我的脚本,它就可以了.

eip*_*i10 1

df$a == "2"返回逻辑向量,同时which(df$a=="2")返回索引。如果向量中存在缺失值,第一种方法会将它们包含在返回值中,但which会排除它们。

例如:

x=c(1,NA,2,10)

x[x==2]
Run Code Online (Sandbox Code Playgroud)
[1] NA  2
Run Code Online (Sandbox Code Playgroud)
x[which(x==2)]
Run Code Online (Sandbox Code Playgroud)
[1] 2
Run Code Online (Sandbox Code Playgroud)
x==2
Run Code Online (Sandbox Code Playgroud)
[1] FALSE    NA  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
which(x==2)
Run Code Online (Sandbox Code Playgroud)
[1] 3
Run Code Online (Sandbox Code Playgroud)