假设我有一个数据框,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)
看起来两种方式都是一样的...我在一个大型数据框中得到了一些奇怪的结果(即返回空行以及正确的行)但是一旦我清理了环境并重新编写了我的脚本,它就可以了.
df$a == "2"返回逻辑向量,同时which(df$a=="2")返回索引。如果向量中存在缺失值,第一种方法会将它们包含在返回值中,但which会排除它们。
例如:
x=c(1,NA,2,10)
x[x==2]
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)[1] NA 2
x[which(x==2)]
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)[1] 2
x==2
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)[1] FALSE NA TRUE FALSE
which(x==2)
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)[1] 3