【问题标题】:Replicating Excel cell formulae in R在R中复制Excel单元格公式
【发布时间】:2019-07-29 21:23:04
【问题描述】:

我对 R 的经验很少。我不知道如何在 R 中进行以下计算,我应该模仿 Excel 还是有更好的方法来进行简单的 Excel 单元格减法。

我在 R 中有以下数据。

year    marketplace bridged_on  value
01/01/2018  US  A    1,710,103,328 
01/01/2018  US  B    1,710,103,328 
01/01/2018  US  C    1,710,103,328 
01/01/2018  US  D    1,710,103,328 
01/01/2019  US  A    1,669,210,438 
01/01/2019  US  B    1,653,940,292 
01/01/2019  US  C    1,624,487,359 
01/01/2019  US  D    1,617,335,174 
01/01/2020  US  A    1,674,636,402 
01/01/2020  US  B    1,647,437,876 
01/01/2020  US  C    1,601,234,000 
01/01/2020  US  D    1,591,107,584 

我需要计算每年的变化,在 Excel 中,我正在创建一个以年份为列的数据透视表,然后跨单元格应用减法公式。

这是在 Excel 中完成的计算的屏幕截图。我正在计算 A 和 B、B 和 C、C 和 D 之间的差异,然后减去与上一年相同的差异。比如H6中的计算是(C6-C7)-(D6-D7)。

我不确定如何在 R 中重现相同的计算并将 G5 到 H8 作为 R 中的输出。

【问题讨论】:

  • 你试过tidyr::spreaddata.table::dcast吗? (我建议将这两个作为 reshape2:: 函数之前的起点......可能首先是 tidyr。)

标签: r reshape reshape2


【解决方案1】:

准备和清理数据

library(dplyr)
library(stringr)
library(purrr)
library(lubridate)
library(readr)
library(reshape2)

data <- read_delim("year    marketplace bridged_on  value
01/01/2018  US  A    1,710,103,328 
01/01/2018  US  B    1,710,103,328 
01/01/2018  US  C    1,710,103,328 
01/01/2018  US  D    1,710,103,328 
01/01/2019  US  A    1,669,210,438 
01/01/2019  US  B    1,653,940,292 
01/01/2019  US  C    1,624,487,359 
01/01/2019  US  D    1,617,335,174 
01/01/2020  US  A    1,674,636,402 
01/01/2020  US  B    1,647,437,876 
01/01/2020  US  C    1,601,234,000 
01/01/2020  US  D    1,591,107,584 ",delim = " ")

colnames(data) <- str_trim(colnames(data))
data <- map_dfc(data,str_trim)

data <- data %>%
    mutate(year= mdy(year),
           value = parse_number(value))

#display cleaned data

> data 
# A tibble: 12 x 4
   year       marketplace bridged_on      value
   <date>     <chr>       <chr>           <dbl>
 1 2018-01-01 US          A          1710103328
 2 2018-01-01 US          B          1710103328
 3 2018-01-01 US          C          1710103328
 4 2018-01-01 US          D          1710103328
 5 2019-01-01 US          A          1669210438
 6 2019-01-01 US          B          1653940292
 7 2019-01-01 US          C          1624487359
 8 2019-01-01 US          D          1617335174
 9 2020-01-01 US          A          1674636402
10 2020-01-01 US          B          1647437876
11 2020-01-01 US          C          1601234000
12 2020-01-01 US          D          1591107584

回答您的问题

我相信你在第 8 行的计算是错误的。您正在根据您提供的公式使用总计进行计算。

要在 R 中做到这一点,您需要以 长格式 构造数据框并使用dplyr::lag() 计算不同年份之间的差异。最后,需要使用reshape2::dcast()从长格式转换为宽格式。

您可以分解管道并查看每个步骤的中间结果。

result <- data %>%
    mutate(year = year(year)) %>%
    group_by(bridged_on) %>%
    mutate(annual_diff = value - lag(value)) %>%
    ungroup() %>%
    dplyr::filter(!is.na(annual_diff)) %>%
    group_by(year) %>%
    mutate(annual_diff2 = annual_diff - lag(annual_diff)) %>%
    dplyr::filter(!is.na(annual_diff2)) %>%
    select(year,bridged_on,annual_diff2) %>%
    ungroup() %>%
    dcast(bridged_on ~ year)

>result
  bridged_on      2019      2020
1          B -15270146 -11928380
2          C -29452933 -16750943
3          D  -7152185  -2974231

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多