gpt4 book ai didi

r - 嵌套列表 "addition"

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

我有一个问题

df = data.frame(col1 = c("A", "B", "C", "A", "A", "B"), col2 = c(0.2, 0.2, 0.6, 1, 0.8, 0.2), id = c(1, 1, 1, 2, 3, 3)) %>% group_by(id) %>% summarise(col1 = list(col1), col2 = list(col2))

看起来像下面这样

| col1      | col2            | id |
|-----------|-----------------|----|
| [A, B, C] | [0.2, 0.2, 0.6] | 1 |
| [A] | [1] | 2 |
| [A, B, D] | [0.8, 0.1, 0.1] | 3 |

和一些参数

col1_to_add <- c("A", "C", "D")
col2_to_add <- c(0.1, 0.1, 0.1)
rel_ids <- c(2, 3)

我想在 rel_ids 行中做一种嵌套列表“添加”,我将 col2 中的值“对应”到 A、C 和 D通过值 col2_to_add。更准确地说,我想对这些数据执行以下操作:

df$id 包含在 rel_ids 中的每一行中(在本例中,在第 2 行和第 3 行中)...

  1. col1_to_add 中的元素添加到 col1(如果它们不存在),例如
| col1            | col2            | id |
|-----------------|-----------------|----|
| [A, B, C] | [0.2, 0.2, 0.6] | 1 | <- unchanged
| [A, C, D] | [1] | 2 | <- [C, D] added to col1
| [A, B, C, D] | [0.8, 0.1, 0.1] | 3 | <- [C] added to col1
  1. 在相关位置增加col2的值
| col1            | col2                 | id |
|-----------------|----------------------|----|
| [A, B, C] | [0.2, 0.2, 0.6] | 1 | <- unchanged
| [A, C, D] | [1.1, 0.1, 0.1] | 2 | <- A increases by 0.1, C/D gain new 0.1 entries
| [A, B, C, D] | [0.9, 0.1, 0.1, 0.2] | 3 | <- A/D increase by 0.1, B unchanged, C gains new 0.1 entry

我对第一步感觉很舒服,但是我不太确定从哪里开始第二步 - 我想知道是否有有效的方法来进行这种嵌套列表添加(理想情况下在 Dplyr 管道中)而无需存储大量索引等。

最佳答案

我们可以用 'rel_ids'、'col1_to_add'、'col2_add' 创建另一个数据集,然后在 unnest 之后通过 by 'id'、'col1' 进行连接ing 'df' 中的 list 列,获取 transmute 中 'col2' 列的 rowSums,如果需要,再次创建列表列'编号'

library(dplyr)
library(tidyr)

keydat <- crossing(id = rel_ids, col1 = col1_to_add, col2 = col2_to_add)
out <- df %>%
unnest(where(is.list)) %>%
full_join(keydat, by = c("id", "col1")) %>%
transmute(id, col1, col2 = rowSums(across(starts_with("col2")),
na.rm = TRUE)) %>%
arrange(id) %>%
group_by(id) %>%
summarise(across(everything(), list), .groups = 'drop')

-输出

> out
# A tibble: 3 × 3
id col1 col2
<dbl> <list> <list>
1 1 <chr [3]> <dbl [3]>
2 2 <chr [3]> <dbl [3]>
3 3 <chr [4]> <dbl [4]>
> out$col1
[[1]]
[1] "A" "B" "C"

[[2]]
[1] "A" "C" "D"

[[3]]
[1] "A" "B" "C" "D"

> out$col2
[[1]]
[1] 0.2 0.2 0.6

[[2]]
[1] 1.1 0.1 0.1

[[3]]
[1] 0.9 0.2 0.1 0.1

关于r - 嵌套列表 "addition",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73572377/

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