【问题标题】:how to manipulate (or index) a vector in R, using a boolean vector如何使用布尔向量在 R 中操作(或索引)向量
【发布时间】:2016-08-22 11:04:53
【问题描述】:

我正在尝试操作一个向量,使其被其他布尔向量索引:

#vector 1:
V1<-c(1,1,1,1,2,3,6,7,8,9) 

#vector 2:
v2<-c(1,2,3,4,5) 

#condition for manipulation:
boolean_vector<-v2<=3

#indexing using the boolean vector, based on the condition:
v2[boolean_vector] 
[1] 1 2 3 
V1[boolean_vector] 
[1] 1 1 1 3 6 7

这是我的 3 个问题:

  1. 如何更好地在 V2 上编写操作,以便获得相同的结果? (我相信有更好的方法..?)

  2. 当我使用这种方法来操作 V1 时究竟会发生什么?我根据结果假设,R根据V2的结果打印具有相同索引号的元素,然后回收相同的结果,以便打印与V2的元素索引号对应的元素。这是正确的吗?为什么要这样设计?

  3. 有什么好的方法可以根据相同的规则来操作不同的向量?如果我只想打印所有小于等于3的元素,然后可以在任何向量上使用这个规则?

谢谢,

【问题讨论】:

  • 请在帖子中提出一个问题。v 定义在哪里?
  • 谢谢,已编辑 - 它是 V2 @akrun

标签: r vector indexing


【解决方案1】:

首先,请注意,您的向量将被回收用于更长的向量(问题 #2)!

boolean_vector<-v2<=3
boolean_vector
[1]  TRUE  TRUE  TRUE FALSE FALSE

评估V1 向量,条件会将布尔向量应用于V1[1:5],然后对V1[6:10] 重复该过程。在行可能不严格表示相同大小的块的一般应用程序中,这不太可能有用。

对于特定条件,对向量本身使用布尔值(问题 #3)。

V1[V1 <= 3]
v2[v2 <= 3]

如果条件很复杂,最好将其结果保存到向量中(问题 #1)。要概括复杂条件,您可能需要创建一个返回布尔向量的函数。

check <- function(x){
    res <- x <= 3
    return(res)
}

V1[check(V1)]
[1] 1 1 1 1 2 3
v2[check(v2)]
[1] 1 2 3

解决方案源于我question中Roland的cmets。

【讨论】:

  • 谢谢@nya,这很有用。因此,关于您对问题 1 的回答:您定义一个函数,然后通过它运行一个向量以操纵向量?
  • @oba2311 是的。这样,您就可以根据所需条件评估特定向量。这与问题 #3 答案的代码中发生的情况相同,但如果条件复杂,它可能没有用。
【解决方案2】:

也许你可以使用 which()?

new_v<-V2[which(V2<=3)]

您可能应该阅读 which() 函数的介绍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多