R计算净交易价值

时间:2019-02-23 03:42:18

标签: r purrr

library(tidyverse)
data=tibble(lender=c('Tony','Wood','Tony','Tidy'),borrower=c('Wood','Tony','Wood','Tony'),amount=c(1,2,3,4))

enter image description here

这是一个简单的表。我想计算托尼的净额。

例如,在第一行中,托尼借给伍德1,因此应将其标记为-1。

第2行,伍德借给托尼2,对于托尼,它是+2

第3,-3行

第4行,+ 4

两个问题

  1. 计算托尼的总净额。它应该是-1 + 2-3 + 4。 我应该如何在R中编码?

  2. 仅计算Tony和Wood在Tony点之间的总净额。因此,第4行是无关的,应该忽略。托尼和伍德之间的贸易差额是-1 + 2-3。如何编码?

注意:这是大数据。除非您必须使用for循环,否则Map(purrr)是首选。原始金额都是正数。因此,您必须在必要时进行更改。

1 个答案:

答案 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