我有一个整齐的简单数据框:
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完成此工作? 简单地说,我的意思是不必过滤,汇总,重新添加变量列,然后将两个现在分开的数据帧合并。
答案 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