gpt4 book ai didi

r - Tidyverse 解决方案,用于对多列产品进行行式求和

转载 作者:行者123 更新时间:2023-12-05 01:04:03 26 4
gpt4 key购买 nike

问题

我想找到一个优雅的 tidyverse 解决方案来创建每个 n 列的 m 个产品的总和。我不想使用位置匹配,它应该是通用的。

我摆弄了 purrr::pmap_dbl(select(., ends_with(i)), prod) 但没走多远。

m = 3 和 n = 2 的示例

library(tidyverse)

df <- tibble(
x_0 = c(5,6),
x_1 = c(9,1),
x_2 = c(2,1),
y_0 = c(3,2),
y_1 = c(3,2),
y_2 = c(1,3)
)
df
> df
# A tibble: 2 × 6
# x_0 x_1 x_2 y_0 y_1 y_2
#<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 5 9 2 3 3 1
# 6 1 1 2 2 3

我想计算产品的总和:
sum_of_products = x_0 * y_0 + x_1 * y_1 + x_2 + y_2

第一行:5*3+9*3+2*2 = 46;第二行:6*2+1*2+1*3 = 17

期望的输出

df_with_sum_of_products
# x_0 x_1 x_2 y_0 y_1 y_2 sum_of_products
#<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 5 9 2 3 3 1 46
# 6 1 1 2 2 3 17

最佳答案

为了获得一个完全通用且稳健的解决方案,我认为最好将数据框转换为更适合手头任务的东西。

df %>% 
mutate(row=row_number()) %>%
pivot_longer(
-row,
names_sep="_",
names_to=c("name", "index")
) %>%
group_by(row, index) %>%
pivot_wider(names_from=name, values_from=value)
# A tibble: 6 x 4
# Groups: row, index [6]
row index x y
<int> <chr> <dbl> <dbl>
1 1 0 5 3
2 1 1 9 3
3 1 2 2 1
4 2 0 6 2
5 2 1 1 2
6 2 2 1 3

然后计算产品的总和......

df %>% 
mutate(row=row_number()) %>%
pivot_longer(
-row,
names_sep="_",
names_to=c("name", "index")
) %>%
group_by(row, index) %>%
pivot_wider(names_from=name, values_from=value) %>%
mutate(product=x * y) %>%
group_by(row) %>%
summarise(sum_product=sum(product))
# A tibble: 2 x 2
row sum_product
<int> <dbl>
1 1 44
2 2 17

这对行数、变量类型的数量(例如 xyz)以及索引(例如 123)。

编辑

我认为上述解决方案对于变量类型数量的稳健性的说法是错误的。 (因为读取 mutate(product=x * y) 的管道中的阶段。)这是一个解决方案,与修改后的输入数据集一起证明它是。

df1 <- tibble(
x_0 = c(5,6,1,-1), x_1 = c(9,1,1,3), x_2 = c(2,1,3,4),
y_0 = c(3,2,1, 2), y_1 = c(3,2,2,2), y_2 = c(1,3,2,2),
z_0 = c(4,5,1, 3), z_1 = c(3,1,2,1), z_2 = c(2,2,1,3)

)

df1 %>%
mutate(row=row_number()) %>%
pivot_longer(
-row,
names_sep="_",
names_to=c("name", "index")
) %>%
group_by(row, index) %>%
pivot_wider(names_from=name, values_from=value) %>%
group_map(
function(.x, .y, .keep=TRUE) {
.y %>% bind_cols(.x %>% mutate(product = unlist(apply(.x, 1, prod))))
}
) %>% bind_rows() %>%
group_by(row) %>%
summarise(sum_product=sum(product))
# A tibble: 4 x 2
row sum_product
<int> <dbl>
1 1 145
2 2 68
3 3 11
4 4 24

关于r - Tidyverse 解决方案,用于对多列产品进行行式求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72910249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com