【问题标题】:Group to Group division组对组划分
【发布时间】:2017-06-16 14:31:26
【问题描述】:

数据集:

  date     bal      
1/31/2013  10   
1/31/2013  11  
1/31/2013  12  
1/31/2013  13   
1/31/2013  14 
2/28/2013  20   
2/28/2013  30  
2/28/2013  40  
2/28/2013  50   
2/28/2013  60    
3/30/2013  10  
3/30/2013  11     
3/30/2013  12   
3/30/2013  13    
3/30/2013  15    

使用的代码:

bb <- read.csv("abc.csv", stringsAsFactors=T, header=T)
bb
library(dplyr)

new_data <- bb %>% 
   mutate(D = (bal) / lag(bal[1:5])) %>%
   data.frame()
new_data

我们正在划分第 2 组(日期 - 2013 年 2 月 28 日的第二行 = 30)/(第 1 组 - 2013 年 1 月 31 日的第一行 = 10) 即:30 / 10 = 3.000、40/11 = 3.63、50/12 = 4.16 等等。

从上面的代码得到的输出:

     date     bal        D
1   1/31/2013  10       NA
2   1/31/2013  11 1.100000
3   1/31/2013  12 1.090909
4   1/31/2013  13 1.083333
5   1/31/2013  14 1.076923
6   2/28/2013  20       NA
7   2/28/2013  30 3.000000
8   2/28/2013  40 3.636364
9   2/28/2013  50 4.166667
10  2/28/2013  60 4.615385
11  3/30/2013  10       NA
12  3/30/2013  11 1.100000
13  3/30/2013  12 1.090909
14  3/30/2013  13 1.083333
15  3/30/2013  15 1.153846

现在的问题是:

第一组保留为参考=除数,即10、11、12、13 这意味着以下所有日期组(bal)都被第一个参考组划分。

我们希望每次除数都应在下一组日期之前增加,并且与下面的组(除数)相同,依此类推。

     date     bal        D           
1   1/31/2013  10       NA         
2   1/31/2013  11       NA
3   1/31/2013  12       NA  
4   1/31/2013  13       NA 
5   1/31/2013  14       NA
6   2/28/2013  20       NA
7   2/28/2013  30 3.000000       - 30 / 10 = 3
8   2/28/2013  40 3.636364       - 40 / 11 = 3.63  
9   2/28/2013  50 4.166667       - 50 / 12 = 4.16
10  2/28/2013  60 4.615385       - 60 / 13 = 4.61
11  3/30/2013  10       NA          NA
12  3/30/2013  11 1.100000       - 11 / 20 = 0.55 
13  3/30/2013  12 1.090909       - 12 / 30 = 0.4
14  3/30/2013  13 1.083333       - 13 / 40 = 0.325 
15  3/30/2013  15 1.153846       - 15 / 50 = 0.3

我期待上面的输出。

【问题讨论】:

  • 所以日期 Y 的第一个条目应该除以日期 X 的第一个条目(Y 之前的那个)?这是这里的逻辑吗?
  • 考虑到 Y[1] = 1/31/2013, bal = 10, and X[2] = 2/28/2013, bal = 30, 所以我们需要除法 - X[2] / Y[1] 等等。应该应用以下相同的逻辑。
  • 每个日期的行数总是相同吗? (即在这种情况下都是 5)
  • 是的,行数相同。

标签: r dataframe


【解决方案1】:
DF %>%
  group_by(g1=seq_along(bal) %% 5) %>%
  mutate(denominator=lag(bal)) %>%
  ungroup() %>%
  group_by(g2=(seq_along(bal) - 1) %/% 5) %>%
  mutate(denominator=lag(denominator),
         D=bal / denominator) %>%
  ungroup()

# # A tibble: 15 x 6
#         date   bal    g1 denominator    g2        D
#       <fctr> <int> <dbl>       <int> <dbl>    <dbl>
#  1 1/31/2013    10     1          NA     0       NA
#  2 1/31/2013    11     2          NA     0       NA
#  3 1/31/2013    12     3          NA     0       NA
#  4 1/31/2013    13     4          NA     0       NA
#  5 1/31/2013    14     0          NA     0       NA
#  6 2/28/2013    20     1          NA     1       NA
#  7 2/28/2013    30     2          10     1 3.000000
#  8 2/28/2013    40     3          11     1 3.636364
#  9 2/28/2013    50     4          12     1 4.166667
# 10 2/28/2013    60     0          13     1 4.615385
# 11 3/30/2013    10     1          NA     2       NA
# 12 3/30/2013    11     2          20     2 0.550000
# 13 3/30/2013    12     3          30     2 0.400000
# 14 3/30/2013    13     4          40     2 0.325000
# 15 3/30/2013    15     0          50     2 0.300000

【讨论】:

  • 完美。有效。你是一个“宝石”杰森。非常感谢。
  • 嗨 Jason,我有一个问题,如果在运行时,我知道上面代码中的桶数在这种情况下更改为 4 或 6 而不是 5。那么我们可以为这个问题制定一个通用代码吗??
  • 我不确定你的意思。你能举个例子吗?
  • 现在,如果日期有 5 个条目,一个在另一个之下,如果日期有 4 个或 6 个,那么我必须根据日期设置更改代码。是否有一个通用的代码会随机取数字日期的设置。因为这里是 5。
  • 如果数据集中是 4 或 6,您可以将 5 更改为 4 或 6 对吗?如果它在数据集中与 4 和 6 混合,那就很棘手了。
【解决方案2】:

OP has confirmed 每个日期的行数始终相同。有了这个观察,一个非常简单的解决方案是可能的,只需将bal 的值滞后 6 行以获得分母。由于这首先忽略了组,因此有必要将每个组中第一行的结果D 设置为 NA,即最后每 5 行。

data.tablethis 可以写成简洁的“单行”:

library(data.table)   # CRAN version 1.10.4 used
setDT(bb)[, D := bal / shift(bal, 6L)][seq(1L, nrow(bb), 5L), D := NA][]

产生预期结果:

         date bal        D
 1: 1/31/2013  10       NA
 2: 1/31/2013  11       NA
 3: 1/31/2013  12       NA
 4: 1/31/2013  13       NA
 5: 1/31/2013  14       NA
 6: 2/28/2013  20       NA
 7: 2/28/2013  30 3.000000
 8: 2/28/2013  40 3.636364
 9: 2/28/2013  50 4.166667
10: 2/28/2013  60 4.615385
11: 3/30/2013  10       NA
12: 3/30/2013  11 0.550000
13: 3/30/2013  12 0.400000
14: 3/30/2013  13 0.325000
15: 3/30/2013  15 0.300000

【讨论】:

  • 谢谢 Uwe。谢谢你的帮助。
  • 我需要你的帮助,在每组的第 4 和第 5 次,答案应该打印 100%,这意味着,对于第 9、第 10、第 14 和第 15 等等.....值D 下应该是 100。
  • @RS。如果我理解正确,这是一项附加要求,对吧?
  • 在相同的上下文中没有添加它。你想让我为此创建一个新问题吗:)
  • @RS。是的,这是个好主意。请作为一个新问题发布。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2020-05-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
相关资源
最近更新 更多