library(tidyverse)
data=tibble(lender=c('Tony','Wood','Tony','Tidy'),borrower=c('Wood','Tony','Wood','Tony'),amount=c(1,2,3,4))
这是一个简单的表。我想计算托尼的净额。
例如,在第一行中,托尼借给伍德1,因此应将其标记为-1。
第2行,伍德借给托尼2,对于托尼,它是+2
第3,-3行
第4行,+ 4
两个问题
计算托尼的总净额。它应该是-1 + 2-3 + 4。 我应该如何在R中编码?
仅计算Tony和Wood在Tony点之间的总净额。因此,第4行是无关的,应该忽略。托尼和伍德之间的贸易差额是-1 + 2-3。如何编码?
注意:这是大数据。除非您必须使用for循环,否则Map(purrr)是首选。原始金额都是正数。因此,您必须在必要时进行更改。
答案 0 :(得分:2)
这是第一部分的方法,应该很快。通过收集,我们为每笔贷款得到两行,为每个角色得到一个行,然后只需根据角色翻转金额的符号,然后group_by-summaryize获得每个行为者的总净借款。
data %>%
gather(role, name, -amount) %>%
mutate(net = if_else(role == "borrower",
amount,
-amount)) %>%
group_by(name) %>%
summarize(net = sum(net))
## A tibble: 3 x 2
# name net
# <chr> <dbl>
#1 Tidy -4
#2 Tony 2
#3 Wood 2
第二部分,我依靠this answer为借方和贷方创建了字母对,然后进行了相同的求和。
data %>%
rowwise() %>%
mutate(pair = paste(sort(c(lender, borrower)), collapse = " - "),
net = if_else(lender < borrower,
amount,
-amount)) %>%
ungroup() %>%
group_by(pair) %>%
summarize(net = sum(net))
## A tibble: 2 x 2
# pair net
# <chr> <dbl>
#1 Tidy - Tony 4
#2 Tony - Wood 2