gpt4 book ai didi

r - 使用tidyverse的R中多列的加权和

转载 作者:行者123 更新时间:2023-12-01 23:41:27 24 4
gpt4 key购买 nike

我正在尝试生成每个因子水平的加权和。我有四列数据:

col1 = surface area
col 2 = dominant
col 3 = codominant
col 4 = sub

1 2 3 4
125 A NA NA
130 A NA B
150 C B NA
160 B NA NA
90 B A NA
180 C A B
  • 如果仅填充第 2 列,则该值将获得第 1 列的全部值。
  • 如果填充了第 2 列和第 3 列,则第 1 列中的值被分成两半。
  • 如果填充了第 2、3 和 4 列,则第 1 列中的值将一分为三。
  • 如果填充了第 2 列和第 4 列,则第 1 列中的值除以 75/25。

因此,对于上面的示例输出,我的新数据框将是:

1    2
A 326.9
B 331.4
C 134.4

我摆弄了 ifelse 并得到了类似的东西(对于这个例子的两列):

     df1 <- df %>% 
mutate(weighted_dominant = ifelse(!is.na(dominant) & is.na(codominant), Surface_Area,
Surface_Area/2),
weighted_codominant = ifelse(!is.na(codominant), Surface_Area/2, NA )

现在我隔离 intereset 的列:

df2 <- df1 %>% select(dominant, weighted_dominant) %>% 
group by (dominant) %>%
summarise (sum = sum(weighted_dominant)

同样对共显列执行此操作,绑定(bind)两个新数据帧的行并再次执行汇总功能。

这完成了工作,但也需要大约 50 行代码,在我看来,这不是很干净。

我的问题:是否有更好的(tidyverse)方法来进行这种加权汇总?

最佳答案

使用 tidyverse,您可以考虑以下方法。

将行号作为单独的列包含在内,以便您可以在每一行内进行评估。 pivot_longer 会将您的数据放入长格式。

按行号分组后,您可以根据缺少的列确定 A、B 和 C 的值。这假设始终有一个“主导”列(否则,您可以在此处调整逻辑)。

然后,删除您的NA,并计算 A、B 和 C 的权重值。

df %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = c(dominant, codominant, sub)) %>%
group_by(rn) %>%
mutate(weight = case_when(
is.na(value[name == "codominant"]) & is.na(value[name == "sub"]) ~ as.numeric(Surface_Area),
is.na(value[name == "codominant"]) & name == "dominant" ~ Surface_Area * .75,
is.na(value[name == "codominant"]) & name == "sub" ~ Surface_Area * .25,
is.na(value[name == "sub"]) ~ Surface_Area / 2,
TRUE ~ Surface_Area / 3
)) %>%
drop_na() %>%
group_by(value) %>%
summarise(total = sum(weight))

输出

  value total
<chr> <dbl>
1 A 328.
2 B 372.
3 C 135

关于r - 使用tidyverse的R中多列的加权和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64931242/

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