如何汇总不同行中的值并汇总为一行(R)

时间:2019-12-23 15:03:22

标签: r dataframe

我有员工付款数据显示为一行=一条付款记录。变量描述名称,支付的金额和价值。

我的最终目标是要有一个数据框架,其中每个员工=一行,汇总了不同类型的付款,每种付款类型都有自己的变量。

请参见示例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>
<div id='word'>hour</div>
</body>
</html>

如下所示:

data <- data.frame("name" = c("John", "John", "John", "Marie", "Marie", "Alex"),
               "payment.reason" = c("bonus", "bonus", "commission", "commission", "commission", "discretionary bonus"),
               "value" = c(1000, 5000, 2500, 1500, 500, 2500))

这是我追求的最终结果:

   name      payment.reason value
1  John               bonus  1000
2  John               bonus  5000
3  John          commission  2500
4 Marie          commission  1500
5 Marie          commission   500
6  Alex discretionary bonus  2500

我知道我需要散布数据以将Payment.reason值推入列中,但是我正在努力弄清楚如何对每个人的每个单独的付款类型值求和,并使数据按每个人分组人。

先谢谢您!

5 个答案:

答案 0 :(得分:8)

我们可以使用pivot_wider中的tidyr来完成所有这些操作:

library(tidyr)

pivot_wider(data, name, names_from = payment.reason, values_from = value, values_fn = list(value = sum))
#> # A tibble: 3 x 4
#>   name  bonus commission `discretionary bonus`
#>   <fct> <dbl>      <dbl>                 <dbl>
#> 1 John   6000       2500                    NA
#> 2 Marie    NA       2000                    NA
#> 3 Alex     NA         NA                  2500

reprex package(v0.3.0)于2019-12-23创建

请注意(如@AlexB的回答),如果需要显式values_fill = list(value = 0)而不是0,也可以添加NA

答案 1 :(得分:6)

library(tidyr)    
data %>%
  group_by(name, payment.reason) %>%
  summarise(value = sum(value)) %>%
  pivot_wider(name, names_from = payment.reason,  values_from = value, values_fill = list(value = 0))

  name  `discretionary bonus` bonus commission
  <fct>                 <dbl> <dbl>      <dbl>
1 Alex                   2500     0          0
2 John                      0  6000       2500
3 Marie                     0     0       2000

答案 2 :(得分:6)

我们可以使用library(data.table) setDT(data)[, value := sum(value), by = c("name", "payment.reason")] data <- unique(data) data <- reshape(data, idvar = "name", timevar = "payment.reason", direction = "wide") data[is.na(data)] <- 0 colnames(data) = gsub("value.", "", colnames(data)) data name bonus commission discretionary bonus # 1: John 6000 2500 0 # 2: Marie 0 2000 0 # 3: Alex 0 0 2500 中的dcast并利用data.table

fun.aggregate

或来自library(data.table) dcast(setDT(data), name ~ payment.reason, value.var = 'value', sum) # name bonus commission discretionary bonus #1: Alex 0 0 2500 #2: John 6000 2500 0 #3: Marie 0 2000 0 的{​​{1}}

xtabs

答案 3 :(得分:3)

这是基本的R解决方案,其中使用了reshape()aggregate()

dfout <- reshape(aggregate(data[3],data[-3],FUN = sum),
                 direction = "wide",
                 idvar = "name",
                 timevar = "payment.reason")
dfout[is.na(dfout)] <- 0

如此

> dfout
   name value.bonus value.commission value.discretionary bonus
1  John        6000             2500                         0
3 Marie           0             2000                         0
4  Alex           0                0                      2500

答案 4 :(得分:2)

使用Navigator.of(context).pop();

data.table