我有员工付款数据显示为一行=一条付款记录。变量描述名称,支付的金额和价值。
我的最终目标是要有一个数据框架,其中每个员工=一行,汇总了不同类型的付款,每种付款类型都有自己的变量。
请参见示例:
<!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值推入列中,但是我正在努力弄清楚如何对每个人的每个单独的付款类型值求和,并使数据按每个人分组人。
先谢谢您!
答案 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