使用tidyverse对长格式数据框中的两个变量求和

时间:2019-02-04 17:43:18

标签: r dplyr tidyverse

我有一个整齐的简单数据框:

  group variable               value
  <fct> <chr>                  <dbl>
1     fishers_here         100
1     money_per_fisher     2000
1     unnecessary_variable 10
2     fishers_here         140
2     money_per_fisher     8000
2     unnecessary_variable 304
3     fishers_here         10
3     money_per_fisher     9000
....

对于每个组,我希望使用变量“组中的总金额”,即fishers_here * money_per_fisher;基本上我希望它看起来像这样:

  group variable               value
  <fct> <chr>                  <dbl>
1     fishers_here         100
1     money_per_fisher     2000
1     unnecessary_variable 10
1     TOTAL_MONEY          200000

....

有没有一种简单的方法可以用tidyverse完成此工作? 简单地说,我的意思是不必过滤,汇总,重新添加变量列,然后将两个现在分开的数据帧合并。

3 个答案:

答案 0 :(得分:3)

您可以spread,进行乘法,然后gather进行备份。请注意,我假设第6行的组号中有一个错字,应该是第2组而不是第1组。如果不是这种情况,则需要执行一些附加的清洁步骤。您还可以根据需要对结果行进行排序(例如,将每个组的行放回去)

library(tidyverse)
tbl <- read_table2(
  "group variable               value
  1     fishers_here         100
1     money_per_fisher     2000
1     unnecessary_variable 10
2     fishers_here         140
2     money_per_fisher     8000
2     unnecessary_variable 304
3     fishers_here         10
3     money_per_fisher     9000"
)
tbl %>%
  spread(variable, value) %>%
  mutate(total_money_in_group = money_per_fisher * fishers_here) %>%
  gather(variable, value, -group)
#> # A tibble: 12 x 3
#>    group variable               value
#>    <dbl> <chr>                  <dbl>
#>  1     1 fishers_here             100
#>  2     2 fishers_here             140
#>  3     3 fishers_here              10
#>  4     1 money_per_fisher        2000
#>  5     2 money_per_fisher        8000
#>  6     3 money_per_fisher        9000
#>  7     1 unnecessary_variable      10
#>  8     2 unnecessary_variable     304
#>  9     3 unnecessary_variable      NA
#> 10     1 total_money_in_group  200000
#> 11     2 total_money_in_group 1120000
#> 12     3 total_money_in_group   90000

reprex package(v0.2.1)于2019-02-04创建

答案 1 :(得分:2)

一个选择是tracing or maintenance,按“组”分组的“ money_per_fisher”,“ fishers_here”,filter以获得“值”的summarise,将行与原始数据和prod按“组”

arrange

数据

library(tidyverse)
df1 %>%
   filter(variable %in% c('fishers_here', 'money_per_fisher')) %>%
   group_by(group) %>% 
   summarise(variable = "total_money_in_group", value = prod(value)) %>% 
   bind_rows(tbl, .) %>% 
   arrange(group)
# A tibble: 11 x 3
#   group variable               value
#   <int> <chr>                  <dbl>
# 1     1 fishers_here             100
# 2     1 money_per_fisher        2000
# 3     1 unnecessary_variable      10
# 4     1 total_money_in_group  200000
# 5     2 fishers_here             140
# 6     2 money_per_fisher        8000
# 7     2 unnecessary_variable     304
# 8     2 total_money_in_group 1120000
# 9     3 fishers_here              10
#10     3 money_per_fisher        9000
#11     3 total_money_in_group   90000

答案 2 :(得分:0)

根据您的输出,我认为这是一种可能的解决方案:

df %>% 
   group_by(group) %>% 
   summarise(value = prod(value))

编辑:如果要在原始数据集中添加一列,则可以使用mutate代替summarise