【问题标题】:Finding the same elements with the same index for two vectors为两个向量查找具有相同索引的相同元素
【发布时间】:2018-03-10 16:50:37
【问题描述】:

我正在寻找一种有效的方法来在两个向量中找到具有相同索引的相同元素并计算它们。 假设我有两个向量,我想知道我实现了多少次 [1,1] 因此,如果我有两个向量(实际上它们会非常大),例如

x=c(2,1,8,1,4)
y=c(9,1,8,0,4)

我想计算 1 在 x 和 y 的相同位置只出现一次。 非常感谢您的帮助!

【问题讨论】:

  • 感觉好像错过了什么,但这不就是sum(x == y & x == 1)吗?
  • 我已经检查过了,它没有计算在比较向量时给出 (1,1) 的所有相同条目。 akrun 的 reduce 方法非常有效
  • @Arbiturka 这很有趣......它们在逻辑上似乎是等价的,但浮点数学可能会产生干扰。能举个例子吗?
  • 当然,我举了一个简单的例子来测试它是否有效:x=c(1,4,1,1,7,1) y=c(1,5,1,6,7, 1) sum(x=y & x==0) [1] 0 所以,我得到了 0,而它应该是 3
  • @Arbiturka 我认为您复制了错误的代码。应该是x==y,而不是x=y?另外,应该测试x==1,但你写了x==0。 sum(x==y & x == 1) 给我 3。顺便说一句,对于 cmets 中的代码,您可以使用反引号,对于多行代码,请使用 ; 中断,以便可以复制粘贴。

标签: r loops vector count


【解决方案1】:

我们可以通过cbind创建一个matrix向量,检查它是否等于1,得到rowSums,如果两个向量在同一位置有1,则为2,如果有只有一个 1,值将是 1。因此,将其转换为逻辑 vector(==2 或 ==1)并使用 sum 获取计数

sum(rowSums(cbind(x, y)==1)==2)
sum(rowSums(cbind(x, y)==1)==1)

请注意,这还会检查 1 是在“x”还是“y”中,而不仅仅是在“x”中


或者Reduce

sum(Reduce(`&`, lapply(list(x, y), `==`, 1)))

请注意,这些解决方案可以扩展到多个 vectors 而不仅仅是两个

【讨论】:

    【解决方案2】:

    对于所有正在寻找您迫切需要的快速tidyverse 修复程序的人:

    library(purrr)
    
    map(list(x, y), ~.== 1) %>% reduce(., `&`) %>% sum
    

    对于索引:

    map(list(x, y), ~.== 1) %>% reduce(., `&`) %>% which
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 2017-08-09
      相关资源
      最近更新 更多