使用 dplyr 将 tibbles 列表除以 R 中的 tibbles 列表
Divide list of tibbles by a list of tibbles in R using dplyr
假设我有一个嵌套的 tibble,格式如下:
# A tibble: 3 x 3
AccountNumber Tibble1 Tibble2
<int> <list> <list>
1 1 <tibble [1 x 3]> <tibble [1 x 3]>
2 2 <tibble [1 x 3]> <tibble [1 x 3]>
3 3 <tibble [1 x 3]> <tibble [1 x 3]>
这可以通过以下代码生成:
library(tidyverse)
tibble1 <- tibble(AccountNumber = 1:3, A_1 = 1, B_1 = 2, C_1 = 3) %>%
group_by(AccountNumber) %>%
nest(.key = "Tibble1")
tibble2 <- tibble(AccountNumber = 1:3, A_2 = 4, B_2 = 5, C_2 = 6) %>%
group_by(AccountNumber) %>%
nest(.key = "Tibble2")
tibble_joined <- left_join(tibble1, tibble2, by = "AccountNumber")
- 如何通过将 Tibble1 除以 Tibble 2 来创建第三个 tibble 列表?
基本上我想要以下格式:
# A tibble: 3 x 3
AccountNumber Tibble1 Tibble2 Tibble3(Tibble2 / Tibble1)
<int> <list> <list> <list>
1 1 <tibble [1 x 3]> <tibble [1 x 3]> <tibble [1 x 3]>
2 2 <tibble [1 x 3]> <tibble [1 x 3]> <tibble [1 x 3]>
3 3 <tibble [1 x 3]> <tibble [1 x 3]> <tibble [1 x 3]>
...其中 Tibble3 只是 Tibble 2 与 Tibble 1 的比率:
- 每列
- 每个账号
到目前为止我的尝试是:
tibble_joined %>%
group_by(AccountNumber) %>%
mutate(Tibble3 = tibble(tibble2 / tibble1))
和
tibble_joined %>%
group_by(AccountNumber) %>%
summarise(Tibble3 = tibble2 / tibble1)
这两个都给出了这个错误:
Error in mutate_impl(.data, dots) :
Evaluation error: non-numeric argument to binary operator.
我试图找到这个问题的优雅解决方案,但我找不到任何东西。
============================================= ============================
我完全知道我的问题可以通过以下方式解决:
tibble_Main %>%
group_by(AccountNumber) %>%
unnest() %>%
mutate(A_Ratio = A_2 / A_1,
B_Ratio = B_2 / B_1,
C_Ratio = C_2 / C_2)
...生成以下内容:
# A tibble: 3 x 10
# Groups: AccountNumber [3]
AccountNumber A_1 B_1 C_1 A_2 B_2 C_2 A_Ratio B_Ratio C_Ratio
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1.00 2.00 3.00 4.00 5.00 6.00 4.00 2.50 1.00
2 2 1.00 2.00 3.00 4.00 5.00 6.00 4.00 2.50 1.00
3 3 1.00 2.00 3.00 4.00 5.00 6.00 4.00 2.50 1.00
...但这看起来很麻烦,并且会在许多列中变得烦人。
我们可以使用 purrr
中的 map2
将一个 tibble
分给另一个
library(purrr)
res <- tibble_joined %>%
mutate(Tibble3 = map2(Tibble1, Tibble2, ~ as_tibble( .y/.x) %>%
rename_all(funs(sub('_.*', "_ratio", .)))))
res
# A tibble: 3 x 4
# AccountNumber Tibble1 Tibble2 Tibble3
# <int> <list> <list> <list>
#1 1 <tibble [1 x 3]> <tibble [1 x 3]> <tibble [1 x 3]>
#2 2 <tibble [1 x 3]> <tibble [1 x 3]> <tibble [1 x 3]>
#3 3 <tibble [1 x 3]> <tibble [1 x 3]> <tibble [1 x 3]>
res$Tibble3
#[[1]]
# A tibble: 1 x 3
# A_ratio B_ratio C_ratio
# <dbl> <dbl> <dbl>
#1 4.00 2.50 2.00
#[[2]]
# A tibble: 1 x 3
# A_ratio B_ratio C_ratio
# <dbl> <dbl> <dbl>
#1 4.00 2.50 2.00
#[[3]]
# A tibble: 1 x 3
# A_ratio B_ratio C_ratio
# <dbl> <dbl> <dbl>
#1 4.00 2.50 2.00
注意:purrr
是 tidyverse
包的一部分
假设我有一个嵌套的 tibble,格式如下:
# A tibble: 3 x 3
AccountNumber Tibble1 Tibble2
<int> <list> <list>
1 1 <tibble [1 x 3]> <tibble [1 x 3]>
2 2 <tibble [1 x 3]> <tibble [1 x 3]>
3 3 <tibble [1 x 3]> <tibble [1 x 3]>
这可以通过以下代码生成:
library(tidyverse)
tibble1 <- tibble(AccountNumber = 1:3, A_1 = 1, B_1 = 2, C_1 = 3) %>%
group_by(AccountNumber) %>%
nest(.key = "Tibble1")
tibble2 <- tibble(AccountNumber = 1:3, A_2 = 4, B_2 = 5, C_2 = 6) %>%
group_by(AccountNumber) %>%
nest(.key = "Tibble2")
tibble_joined <- left_join(tibble1, tibble2, by = "AccountNumber")
- 如何通过将 Tibble1 除以 Tibble 2 来创建第三个 tibble 列表?
基本上我想要以下格式:
# A tibble: 3 x 3
AccountNumber Tibble1 Tibble2 Tibble3(Tibble2 / Tibble1)
<int> <list> <list> <list>
1 1 <tibble [1 x 3]> <tibble [1 x 3]> <tibble [1 x 3]>
2 2 <tibble [1 x 3]> <tibble [1 x 3]> <tibble [1 x 3]>
3 3 <tibble [1 x 3]> <tibble [1 x 3]> <tibble [1 x 3]>
...其中 Tibble3 只是 Tibble 2 与 Tibble 1 的比率:
- 每列
- 每个账号
到目前为止我的尝试是:
tibble_joined %>%
group_by(AccountNumber) %>%
mutate(Tibble3 = tibble(tibble2 / tibble1))
和
tibble_joined %>%
group_by(AccountNumber) %>%
summarise(Tibble3 = tibble2 / tibble1)
这两个都给出了这个错误:
Error in mutate_impl(.data, dots) :
Evaluation error: non-numeric argument to binary operator.
我试图找到这个问题的优雅解决方案,但我找不到任何东西。
============================================= ============================
我完全知道我的问题可以通过以下方式解决:
tibble_Main %>%
group_by(AccountNumber) %>%
unnest() %>%
mutate(A_Ratio = A_2 / A_1,
B_Ratio = B_2 / B_1,
C_Ratio = C_2 / C_2)
...生成以下内容:
# A tibble: 3 x 10
# Groups: AccountNumber [3]
AccountNumber A_1 B_1 C_1 A_2 B_2 C_2 A_Ratio B_Ratio C_Ratio
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1.00 2.00 3.00 4.00 5.00 6.00 4.00 2.50 1.00
2 2 1.00 2.00 3.00 4.00 5.00 6.00 4.00 2.50 1.00
3 3 1.00 2.00 3.00 4.00 5.00 6.00 4.00 2.50 1.00
...但这看起来很麻烦,并且会在许多列中变得烦人。
我们可以使用 purrr
中的 map2
将一个 tibble
分给另一个
library(purrr)
res <- tibble_joined %>%
mutate(Tibble3 = map2(Tibble1, Tibble2, ~ as_tibble( .y/.x) %>%
rename_all(funs(sub('_.*', "_ratio", .)))))
res
# A tibble: 3 x 4
# AccountNumber Tibble1 Tibble2 Tibble3
# <int> <list> <list> <list>
#1 1 <tibble [1 x 3]> <tibble [1 x 3]> <tibble [1 x 3]>
#2 2 <tibble [1 x 3]> <tibble [1 x 3]> <tibble [1 x 3]>
#3 3 <tibble [1 x 3]> <tibble [1 x 3]> <tibble [1 x 3]>
res$Tibble3
#[[1]]
# A tibble: 1 x 3
# A_ratio B_ratio C_ratio
# <dbl> <dbl> <dbl>
#1 4.00 2.50 2.00
#[[2]]
# A tibble: 1 x 3
# A_ratio B_ratio C_ratio
# <dbl> <dbl> <dbl>
#1 4.00 2.50 2.00
#[[3]]
# A tibble: 1 x 3
# A_ratio B_ratio C_ratio
# <dbl> <dbl> <dbl>
#1 4.00 2.50 2.00
注意:purrr
是 tidyverse
包的一部分