C++ 或 Rcpp : comparison of two vectors without loop

标签 c++ r rcpp

我是 C++ 和 Rcpp 的新手,我想知道如何在没有循环的情况下一次比较两个不同 vector 的每个元素。

我的目标是改变 v1 的元素通过引用其他 vector 。`

当前代码是

v1 = {6,7,8,9,10}
v2 = {2,4,6,8,10}
v3 = {a,b,a,b,c}
v4 = {0,0,0,0,0}
v5 = {a,b,c}
v6 = {1,2,3}

for (i in 1:5){
  if (v1[i] > v2[i]){
    for (j in 1:3){
      if (v5[j] == v3[i]){
        v4[i] = v2[i] + v6[j]
          if (v1[i] > v4[i]){
            v1[i] = v4[i]
          }
      }
    }
  }
}  

结果应该是

v1 = {3,6,7,9,10}

事实上,v1, v2, v3, v4v5, v6是不同的dataframe在 R. v1 的每个元素与 v2 相比.如果元素 iv1大于 i v2 中的元素, v1 的元素成为 i 的总和v1 的元素和 v6 的元素通过对应v3 & v5 .那么新的估计值v4[i]v1[i] 相比.

我在 v1~v5 中有大量案例和 v5~v6 .在这种情况下,使用 loop花费很长时间。是否可以在没有循环的情况下比较不同的 vector ?或者如何估计和引用其他 vector 的元素?

最佳答案

我认为这里不需要使用 Rcpp 或 C++。我理解您的要求的方式是,您正在尝试操纵两组相等长度的 vector 。对于“一组等长” vector ,通常使用 data.frame 或其扩展之一。在这里,我使用基础 R、data.tabledplyr 以及 tibble。自己看看你喜欢哪种语法。一般来说,对于大型数据集,data.table 很可能会更快。

设置数据:

v1 <- c(6,7,8,9,10)
v2 <- c(2,4,6,8,10)
v3 <- c("a","b","a","b","c")
v5 <- c("a","b","c")
v6 <- c(1,2,3)

基础 R:

df1 <- data.frame(v1, v2, v3)
df2 <- data.frame(v5, v6)

df1 <- merge(df1, df2, by.x = "v3", by = "v5")
df1$v4 <- df1$v2 + df1$v6
df1$v1 <- ifelse(df1$v1 > df1$v2 & df1$v1 > df1$v4, df1[["v4"]], df1[["v1"]])
df1
#>   v3 v1 v2 v6 v4
#> 1  a  3  2  1  3
#> 2  a  7  6  1  7
#> 3  b  6  4  2  6
#> 4  b  9  8  2 10
#> 5  c 10 10  3 13

数据表:

library(data.table)
dt1 <- data.table(v1, v2, v3, key = "v3")
dt2 <- data.table(v5, v6, key = "v5")

dt1[dt2, v4 := v2 + v6]
dt1[v1 > v2 & v1 > v4, v1 := v4]
dt1
#>    v1 v2 v3 v4
#> 1:  3  2  a  3
#> 2:  7  6  a  7
#> 3:  6  4  b  6
#> 4:  9  8  b 10
#> 5: 10 10  c 13

dplyr:

suppressPackageStartupMessages(library(dplyr))
t1 <- tibble(v1, v2, v3)
t2 <- tibble(v5, v6)
t1 %>% 
  inner_join(t2, by = c("v3" = "v5")) %>%
  mutate(v4 = v2 + v6) %>%
  mutate(v1 = case_when(
    v1 > v2 & v1 > v4 ~ v4,
    TRUE ~ v1
  ))
#> # A tibble: 5 x 5
#>      v1    v2 v3       v6    v4
#>   <dbl> <dbl> <chr> <dbl> <dbl>
#> 1     3     2 a         1     3
#> 2     6     4 b         2     6
#> 3     7     6 a         1     7
#> 4     9     8 b         2    10
#> 5    10    10 c         3    13

reprex package 创建于 2019-04-19 (v0.2.1)

大意总是一样的:

  • 在字符列上连接两个表
  • 创建新列 v4 作为 v2v6 的总和
  • v1 更新为 v4 的值,其中 v1 > v2v1 > v4

请注意,基 R 和 data.table 不保留顺序,因此将输出放入额外的列中更有意义。

关于C++ 或 Rcpp : comparison of two vectors without loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55738376/

相关文章:

c++ - RHEL5中的字符串析构函数问题

c++ - 在 Eclipse 上运行 C++ 代码的问题 - 使用 Lynda 教程学习

r - 线性回归 - 将预测值附加到同一数据集

r - 禁用 RcppArmadillo 中的 'Crippled Lapack' 警告

c++ - 无法转换 double - new 运算符

c++ - 使用 MPI_Scatter 时出现段错误

R Shiny : How to color margin of title panel?

r - 在 r 中导入结构不良的数据

r - 来自随机正态分布的平行样本——不是更快吗?

c++ - 在 Rcpp 中用随机生成的值填充 vector 的一部分