【问题标题】:Calculating Growth Percentage in R Dataframe计算 R Dataframe 中的增长百分比
【发布时间】:2018-10-16 10:44:53
【问题描述】:

我在下面提到了数据框:

Month         Val1          Val2      Part1      Part2
Feb-17        250           10000     25         100
A             25            2000      5          20
B             25            2000      5          20
C             100           2000      5          20
D             10            2000      5          20
E             40            2000      5          20
Jan-17        200           8000     50         100
A             20            1000      10         20
B             40            1600      10         20
C             100           1600      10         20
D             20            1600      10         20
E             20            2200      10         20

我想在Val1Per_2Val2 之后添加两列Per_1。将 2 月 17 日的数据与 1 月 17 日的数据进行比较,并给出增长百分比(增加或减少)。

注意:对于 A、B、C、D 和 E,2 月 17 日和 17 年 1 月的顺序会有所不同,这里 我想分别用 Jan-17 A 和 Jan-17 A 计算 Feb-17 A 的增长。

在 17 月的情况下,由于数据框中没有上个月的数据可比较,Per_1Per_2 在这种情况下应该是 0.00%

所需输出:

Month   Val1    Per_1   Val2    Per_2   Part1   Part2
Feb-17  250     25.00%  10000   25.00%  25  100
A       25      25.00%  2000    100.00% 5   20
B       25     -37.50%  2000    25.00%  5   20
C       100     0.00%   2000    25.00%  5   20
D       10     -50.00%  2000    25.00%  5   20
E       40      100.00% 2000    -9.09%  5   20
Jan-17  200     0.00%   8000    0.00%   50  100
C       100     0.00%   1600    0.00%   10  20
A       20      0.00%   1000    0.00%   10  20
B       40      0.00%   1600    0.00%   10  20
E       20      0.00%   2200    0.00%   10  20
D       20      0.00%   1600    0.00%   10  20

【问题讨论】:

  • 首先,你应该改变你的data.frame的格式来做这个操作。原因很简单:行代表不同的个体,因为第 1 行是指聚合样本,而第 2 到 6 行是指个体样本。一旦你有一个一致的data.frame(意味着所有的行代表相同性质的个体),你可以简单地根据变量月份执行分组并使用公式计算相对变化来计算连续行之间的差异,如lag、@987654331 @ 或 diff
  • @Seymour 我们不能在多个 if else 条件下执行这些操作吗??
  • 您可能可以,但这种方法会使您的生活复杂化。但是,你能提供一个可重现的例子吗?
  • @Seymour 这是可重现的示例:structure(list(Month = c("Feb-17", "A", "B", "C", "D", "E", "Jan-17", "A", "B", "C", "D", "E"), Val1 = c(250L, 25L, 25L, 100L, 10L, 40L, 200L, 20L, 40L, 100L, 20L, 20L), Val2 = c(10000L, 2000L, 2000L, 2000L, 2000L, 2000L, 8000L, 1000L, 1600L, 1600L, 1600L, 2200L), Part1 = c(25L, 5L, 5L, 5L, 5L, 5L, 50L, 10L, 10L, 10L, 10L, 10L), Part2 = c(100L, 20L, 20L, 20L, 20L, 20L, 100L, 20L, 20L, 20L, 20L, 20L)), class = "data.frame", row.names = c(NA, -12L))
  • 我还在努力理解你的专栏month...

标签: r dataframe dplyr


【解决方案1】:

这可以通过dplyrlead 完成

我创建了一个单独的列ID,将每个月替换为一个常量值,这样我们就可以group_by 并且每个月都有一个一致的类别。然后我使用lead 创建了Per_1Per_2 列。最后,我选择您想要返回的列,不包括任何中间列。

library(dplyr)
df %>% 
  mutate(ID = ifelse(grepl("\\d",Month),"First",Month)) %>% 
  group_by(ID) %>% 
  mutate(Val1 = as.numeric(Val1),
         Val2 = as.numeric(Val2), 
         next.month1 = lead(Val1, order_by=ID) ,
         next.month2 = lead(Val2, order_by=ID), 
         Per_1 = 100*(Val1-next.month1)/next.month1,
         Per_2 = 100*(Val2-next.month2)/next.month2) %>%
  ungroup() %>% 
  select(Month,Val1,Per_1,Val2,Per_2,Part1,Part2)


# A tibble: 12 x 7
#   Month   Val1  Per_1  Val2   Per_2 Part1 Part2
#   <fct>  <dbl>  <dbl> <dbl>   <dbl> <int> <int>
# 1 Feb-17 250     25.0 10000   25.0     25   100
# 2 A       25.0   25.0  2000  100        5    20
# 3 B       25.0 - 37.5  2000   25.0      5    20
# 4 C      100      0    2000   25.0      5    20
# 5 D       10.0 - 50.0  2000   25.0      5    20
# 6 E       40.0  100    2000 -  9.09     5    20
# 7 Jan-17 200     NA    8000   NA       50   100
# 8 C      100     NA    1600   NA       10    20
# 9 A       20.0   NA    1000   NA       10    20
#10 B       40.0   NA    1600   NA       10    20
#11 E       20.0   NA    2200   NA       10    20
#12 D       20.0   NA    1600   NA       10    20

【讨论】:

  • 谢谢...但我希望在Jan-17 中以相同的顺序保持字母序列(C、A、B、E 和 D)的相同值。
  • 您所需的输出与输入数据帧的顺序不同。您如何确定该顺序?应用此功能时顺序不会更改。考虑到不同的输入功能,我对其进行了更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2021-11-01
  • 2020-12-25
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多