C++ 或 Rcpp:比较两个没有循环的向量
C++ or Rcpp: comparison of two vectors without loop
我是 C++ 和 Rcpp 的新手,我想知道如何在没有循环的情况下一次比较两个不同向量的每个元素。
我的目标是通过引用其他向量来更改 v1
的元素。`
当前代码是
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, v4
和v5, v6
就是R中不同的dataframe
,v1
的每一个元素都与v2
比较。如果v1
中的一个元素i
大于v2
中的i
个元素,则v1
中的元素成为i
个元素的和=12=] 和 v6
的元素对应 v3
& v5
。然后将新估计的值 v4[i]
与 v1[i]
.
进行比较
我在 v1~v5
和 v5~v6
中有大量案例。在这种情况下,使用 loop
需要很长时间。是否可以在没有循环的情况下比较不同的向量?或者如何估计和引用其他向量的元素?
我看不出这里需要使用 Rcpp 或 C++。我理解您的要求的方式是,您正在尝试操纵两组相等长度的向量。对于 "set of equal length" 向量,通常使用 data.frame
或其扩展之一。在这里我使用基础 R,data.table
和 dplyr
与 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
data.table
:
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 (v0.2.1)
于 2019-04-19 创建
大意总是一样的:
- 在字符列上连接两个表
- 创建新列
v4
作为 v2
和 v6
的总和
- 将
v1
更新为 v4
的值,其中 v1 > v2
和 v1 > v4
请注意,基数 R 和 data.table
不保留顺序,因此将输出放入附加列中更有意义。
我是 C++ 和 Rcpp 的新手,我想知道如何在没有循环的情况下一次比较两个不同向量的每个元素。
我的目标是通过引用其他向量来更改 v1
的元素。`
当前代码是
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, v4
和v5, v6
就是R中不同的dataframe
,v1
的每一个元素都与v2
比较。如果v1
中的一个元素i
大于v2
中的i
个元素,则v1
中的元素成为i
个元素的和=12=] 和 v6
的元素对应 v3
& v5
。然后将新估计的值 v4[i]
与 v1[i]
.
我在 v1~v5
和 v5~v6
中有大量案例。在这种情况下,使用 loop
需要很长时间。是否可以在没有循环的情况下比较不同的向量?或者如何估计和引用其他向量的元素?
我看不出这里需要使用 Rcpp 或 C++。我理解您的要求的方式是,您正在尝试操纵两组相等长度的向量。对于 "set of equal length" 向量,通常使用 data.frame
或其扩展之一。在这里我使用基础 R,data.table
和 dplyr
与 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
data.table
:
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 (v0.2.1)
于 2019-04-19 创建大意总是一样的:
- 在字符列上连接两个表
- 创建新列
v4
作为v2
和v6
的总和
- 将
v1
更新为v4
的值,其中v1 > v2
和v1 > v4
请注意,基数 R 和 data.table
不保留顺序,因此将输出放入附加列中更有意义。