在R中:通过对范围为:index==c(min:max)的值进行布尔比较来索引向量
在R中,假设我们有一个向量在R中:通过对范围为:index==c(min:max)的值进行布尔比较来索引向量,r,R,在R中,假设我们有一个向量 area=c(rep(c(26:30),5),rep(c(500:504),5),rep(c(550:554),5),rep(c(76:80),5))和另一个向量yield=c(1:100) 现在,假设我想这样索引: > yield[area==27] [1] 2 7 12 17 22 > yield[area==501] [1] 27 32 37 42 47 没问题,对吧?但是当我尝试使用c(A,B)对它进行索引时,奇怪的事情开始发生。(当我尝试c
area=c(rep(c(26:30),5),rep(c(500:504),5),rep(c(550:554),5),rep(c(76:80),5))
和另一个向量yield=c(1:100)
现在,假设我想这样索引:
> yield[area==27]
[1] 2 7 12 17 22
> yield[area==501]
[1] 27 32 37 42 47
没问题,对吧?但是当我尝试使用c(A,B)
对它进行索引时,奇怪的事情开始发生。(当我尝试c(最小值:最大值)
时,甚至更奇怪)
我期待的当然是其他两个例子中出现的实例,而不仅仅是它们的一些奇怪组合。当我可以使用管道或操作器时,此选项有效:
> yield[area==27 | area==501]
[1] 2 7 12 17 22 27 32 37 42 47
但是如果我在一个靶场工作呢?假设我想按范围c(27:503)
对其进行索引?在我的真实示例中,有更多的数据点和范围,因此更有意义,请不要建议我手动操作,这基本上意味着:
yield[area==27 | area==28 | area==29 | ... | area==303 | ... | area==500 | area==501]
一定有更好的办法 您想在%中使用
%。还要注意,c(27:503)
和27:503
产生相同的对象
> yield[area %in% 27:503]
[1] 2 3 4 5 7 8 9 10 12 13 14 15 17
[14] 18 19 20 22 23 24 25 26 27 28 29 31 32
[27] 33 34 36 37 38 39 41 42 43 44 46 47 48
[40] 49 76 77 78 79 80 81 82 83 84 85 86 87
[53] 88 89 90 91 92 93 94 95 96 97 98 99 100
为什么不使用子集
subset(yield, area > 26 & area < 504) ## for indexes
subset(area, area > 26 & area < 504) ## for values
指数的子集(收益率,面积>26和面积<504)#
值的子集(面积、面积>26和面积<504)##
太棒了,谢谢:)还有,这篇文章到底在哪里被记录下来的?我怎么能不问就找到它?我需要帮助什么?我称之为无用的帮助:P@gakera:它在?匹配中。你应该通过猜测更好的关键词或阅读完整的参考手册来找到它-P我想我第一次看到match
是通过?grep
的“另见”部分。哈哈,猜猜更好的关键词或阅读完整的手册,我喜欢它!R对用户非常友好:D再次感谢。@gakera:出于好奇,您希望在哪里记录这样的内容?也就是说,你在哪里找的?也许应该在某个地方添加一个指向?match
的链接……需要学习的技巧之一(或要避免的gotcha)是在寻求“帮助”时需要向“?”操作符引用一些参数。如果您在%中键入了“?%”,您将获得match()的帮助页。set函数页上还有一个指向“%in%”的链接,该链接描述了并集(x,y)、相交(x,y)、setdiff(x,y)和setequal(x,y)。。。。它们在正确的环境中都很有用,因为它们返回的是原始元素而不是逻辑向量。[我选中了“R简介”。。关于%或匹配()中的%没有任何内容。]为什么不使用它?原因之一:注意?子集
中的警告部分,因为产生[area>26&area<504]
是等效的。警告:这是一个方便的功能,旨在交互使用。对于编程来说,最好使用像“[”这样的标准子集函数,尤其是参数“子集”的非标准求值可能会产生意想不到的后果。@Brandon:请不要把我看得太重。我开始寻找“为什么不”的原因因为那是在你回答的前奏中。;-)不用担心。有趣的是,在我的?子集中,我没有这样的章节。你用的是什么版本?
subset(yield, area > 26 & area < 504) ## for indexes
subset(area, area > 26 & area < 504) ## for values