根据条件聚合
Aggregate with respect to condition
我面临以下问题。
我有一个以这种方式简化的数据集
df <- tibble(ID_1=c("a","a", "a","a", "a", "b", "b", "b", "b"), ID_2 = c("a","b", "c","d", "e", "b", "a", "c", "d"),
other= c(1, "bu", 34, 3, 5, 6, "jud", 82, 9), exchange=c(1, 13, 34, 3, 5, 6, 8, 82, 9),
goods=c("wood","wood", "wood","wood", "wood", "steel", "steel", "steel", "steel"))
df
我们在具有不同 ID 的多个国家/地区之间进行交易。
我想总结A国和B国之间的所有交换,A国和C国之间等等交换的货物。
也就是说,最后,我想要
ID_1 // ID_2 // Sum_exchangeAB
ID_1 // ID_3 // Sum_exchangeBC
....
ID_n // ID_n // Sumexchangenn
我如何在 Dplyr 中做到这一点?我尝试了 group_by (ID_1, ID_2) 然后聚合。或者总结一下。
我尝试了以下示例:dataset2 %>% group_by(ID_1, ID_2, exchange) %>% summarise(dataset2, sum_of_exchange=sum (交换)) 。
但这给了我所有交换的总和(也就是说,它 returns 一个值)。不是两国之间的交换总和。
感谢您的帮助,不胜感激!!
你很接近:
library(dplyr)
df %>% group_by(ID_1, ID_2) %>% summarise(Sum_Exchange = sum(exchange))
这产生:
# A tibble: 9 x 3
# Groups: ID_1 [2]
ID_1 ID_2 Sum_Exchange
<chr> <chr> <dbl>
1 a a 1
2 a b 13
3 a c 34
4 a d 3
5 a e 5
6 b a 8
7 b b 6
8 b c 82
9 b d 9
然后您可以删除相同的 ID 以省略 AA、BB。
df %>%
group_by(ID_1, ID_2) %>%
summarise(Sum_Exchange = sum(exchange)) %>%
filter(ID_1 != ID_2)
来自评论的附加组件
将数据帧与 {dplyr}
的 bind_rows(df1, df2)
相结合。
请注意,bind_rows()
将为 variables/columns 生成原始数据框中不存在的新列,并用 NA
.
填充没有值的现有列的单元格
您可以通过重命名此类变量来强制将某些值设置为相同的 column/variable。
针对您手头的问题。检查你want/need。原始数据框带有 other, goods
个变量。因此,这些不存在于汇总数据框中。执行 bind_rows()
将用 NA 填充这些。要将 Sum_Exchange
放入 exchange
变量中,请重命名该列。
这是你要找的吗?
df %>%
rowwise() %>%
mutate(new_id = paste0(str_sort(c(ID_1, ID_2)), collapse = '-')) %>%
group_by(new_id) %>%
summarize(exchange = sum(exchange))
给出:
# A tibble: 8 x 2
new_id exchange
<chr> <dbl>
1 a-a 1
2 a-b 21
3 a-c 34
4 a-d 3
5 a-e 5
6 b-b 6
7 b-c 82
8 b-d 9
更新:似乎 TO 想要将总和附加到原始数据,这可以通过以下方式完成:
df %>%
rowwise() %>%
mutate(new_id = paste0(str_sort(c(ID_1, ID_2)), collapse = '-')) %>%
group_by(new_id) %>%
mutate(sum_exchange = sum(exchange)) %>%
ungroup()
给出:
# A tibble: 9 x 7
ID_1 ID_2 other exchange goods new_id sum_exchange
<chr> <chr> <chr> <dbl> <chr> <chr> <dbl>
1 a a 1 1 wood a-a 1
2 a b bu 13 wood a-b 21
3 a c 34 34 wood a-c 34
4 a d 3 3 wood a-d 3
5 a e 5 5 wood a-e 5
6 b b 6 6 steel b-b 6
7 b a jud 8 steel a-b 21
8 b c 82 82 steel b-c 82
9 b d 9 9 steel b-d 9
我面临以下问题。 我有一个以这种方式简化的数据集
df <- tibble(ID_1=c("a","a", "a","a", "a", "b", "b", "b", "b"), ID_2 = c("a","b", "c","d", "e", "b", "a", "c", "d"),
other= c(1, "bu", 34, 3, 5, 6, "jud", 82, 9), exchange=c(1, 13, 34, 3, 5, 6, 8, 82, 9),
goods=c("wood","wood", "wood","wood", "wood", "steel", "steel", "steel", "steel"))
df
我们在具有不同 ID 的多个国家/地区之间进行交易。 我想总结A国和B国之间的所有交换,A国和C国之间等等交换的货物。 也就是说,最后,我想要
ID_1 // ID_2 // Sum_exchangeAB
ID_1 // ID_3 // Sum_exchangeBC
....
ID_n // ID_n // Sumexchangenn
我如何在 Dplyr 中做到这一点?我尝试了 group_by (ID_1, ID_2) 然后聚合。或者总结一下。
我尝试了以下示例:dataset2 %>% group_by(ID_1, ID_2, exchange) %>% summarise(dataset2, sum_of_exchange=sum (交换)) 。 但这给了我所有交换的总和(也就是说,它 returns 一个值)。不是两国之间的交换总和。
感谢您的帮助,不胜感激!!
你很接近:
library(dplyr)
df %>% group_by(ID_1, ID_2) %>% summarise(Sum_Exchange = sum(exchange))
这产生:
# A tibble: 9 x 3
# Groups: ID_1 [2]
ID_1 ID_2 Sum_Exchange
<chr> <chr> <dbl>
1 a a 1
2 a b 13
3 a c 34
4 a d 3
5 a e 5
6 b a 8
7 b b 6
8 b c 82
9 b d 9
然后您可以删除相同的 ID 以省略 AA、BB。
df %>%
group_by(ID_1, ID_2) %>%
summarise(Sum_Exchange = sum(exchange)) %>%
filter(ID_1 != ID_2)
来自评论的附加组件
将数据帧与 {dplyr}
的 bind_rows(df1, df2)
相结合。
请注意,bind_rows()
将为 variables/columns 生成原始数据框中不存在的新列,并用 NA
.
填充没有值的现有列的单元格
您可以通过重命名此类变量来强制将某些值设置为相同的 column/variable。
针对您手头的问题。检查你want/need。原始数据框带有 other, goods
个变量。因此,这些不存在于汇总数据框中。执行 bind_rows()
将用 NA 填充这些。要将 Sum_Exchange
放入 exchange
变量中,请重命名该列。
这是你要找的吗?
df %>%
rowwise() %>%
mutate(new_id = paste0(str_sort(c(ID_1, ID_2)), collapse = '-')) %>%
group_by(new_id) %>%
summarize(exchange = sum(exchange))
给出:
# A tibble: 8 x 2
new_id exchange
<chr> <dbl>
1 a-a 1
2 a-b 21
3 a-c 34
4 a-d 3
5 a-e 5
6 b-b 6
7 b-c 82
8 b-d 9
更新:似乎 TO 想要将总和附加到原始数据,这可以通过以下方式完成:
df %>%
rowwise() %>%
mutate(new_id = paste0(str_sort(c(ID_1, ID_2)), collapse = '-')) %>%
group_by(new_id) %>%
mutate(sum_exchange = sum(exchange)) %>%
ungroup()
给出:
# A tibble: 9 x 7
ID_1 ID_2 other exchange goods new_id sum_exchange
<chr> <chr> <chr> <dbl> <chr> <chr> <dbl>
1 a a 1 1 wood a-a 1
2 a b bu 13 wood a-b 21
3 a c 34 34 wood a-c 34
4 a d 3 3 wood a-d 3
5 a e 5 5 wood a-e 5
6 b b 6 6 steel b-b 6
7 b a jud 8 steel a-b 21
8 b c 82 82 steel b-c 82
9 b d 9 9 steel b-d 9