gpt4 book ai didi

r - 根据dplyr中每列中的数据组合数据框

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

假设我有一些网络数据,如下所示:

col_a <- c("A","B","C")
col_b <- c("B","A","A")
val <- c(1,3,7)
df <- data.frame(col_a, col_b, val)
df

col_a col_b val
1 A B 1
2 B A 3
3 C A 7

这可能是一个网络,而 val 可能是两者之间边的权重。但是,我想在 A 和 B 以及 B 和 A 之间添加权重以获得以下结果:

new_col_a <- c("A", "A")
new_col_b <- c("B", "C")
new_val <- c(4,7)
want_df <- data.frame(new_col_a, new_col_b, new_val)
want_df

new_col_a new_col_b new_val
1 A B 4
2 A C 7

有没有办法在 dplyr 中做到这一点?

最佳答案

一个 dplyr 可能是:

df %>%
mutate_if(is.factor, as.character) %>%
group_by(grp = paste(pmin(col_a, col_b), pmax(col_a, col_b), sep = "_")) %>%
summarise(val = sum(val))

grp val
<chr> <dbl>
1 A_B 4
2 A_C 7

或者使用 tidyverse,使用与@Sonny 类似的想法:

df %>%
mutate_if(is.factor, as.character) %>%
nest(col_a, col_b) %>%
group_by(grp = unlist(map(data, function(x) paste(sort(x), collapse = "_")))) %>%
summarise(val = sum(val))

如果你也想把它分成两列(这一步也需要 tidyr):

df %>%
mutate_if(is.factor, as.character) %>%
group_by(grp = paste(pmin(col_a, col_b), pmax(col_a, col_b), sep = "_")) %>%
summarise(val = sum(val)) %>%
separate(grp, c("new_col_a", "new_col_b"), sep = "_")

new_col_a new_col_b val
<chr> <chr> <dbl>
1 A B 4
2 A C 7

或者在第二种可能性的情况下:

df %>%
mutate_if(is.factor, as.character) %>%
nest(col_a, col_b) %>%
group_by(grp = unlist(map(data, function(x) paste(sort(x), collapse = "_")))) %>%
summarise(val = sum(val)) %>%
separate(grp, c("new_col_a", "new_col_b"), sep = "_")

关于r - 根据dplyr中每列中的数据组合数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55733670/

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