我对哪个功能感到困惑。基本上,我认为它可以检查输入对象(例如向量)在哪个位置上的逻辑条件为真。如文档所示:
which(LETTERS == "R")
[1] 18
换句话说,它遍历所有LETTERS值并检查value ==R。但这似乎是一种误解。如果我输入
a <- c("test","test2","test3","test4")
b <- c("test","test3")
which(a==b)
[1] 1
它返回[1] 1
,尽管test3确实也出现在两个向量中。另外,如果我为a输入一个较短的向量,则会返回警告:
a <- c("test","test2","test3")
b <- c("test","test3")
which(a==b)
[1] 1
Warning message:
In a == b : longer object length is not a multiple of shorter object length
我的问题是双重的:
如何返回与字符向量b相匹配的字符向量a的位置?
what()如何运行,因为我显然误解了该函数。
谢谢您的回答
编辑:感谢您的快速答复,您澄清了我的误会!
答案 0 :(得分:3)
==
比较值1与1 (a[1]==b[1]);(a[2]==b[2]).....
而不是集合。
对于设置操作,请使用%in%
使用a[which(a %in% b)]
获取[1] "test" "test3"
which()返回TRUE表达式的索引(!),而不是值。
which(a %in% b)
将返回
[1] 1 3
发出奇怪警告消息的原因是R的回收
Warning message:
In a == b : longer object length is not a multiple of shorter object length
因此,当您将长度为4的向量与长度为2的向量进行比较时,每个值(使用==
)的值R都会回收短向量。在4和2中可以正常工作,您将得到以下问题的答案:(a1 == b1,a2 == b2,a3 == b1,a4 == b2)。对于长度为4和3的情况-您会收到一条警告消息,指出不能将短向量乘以整数以获得长向量长度。
答案 1 :(得分:1)
您需要给which
提供一个输入,告诉它b中a的哪些元素:
which(a%in%b)
[1] 1 3
which
本质上标识了逻辑向量中的元素TRUE
。