【问题标题】:multiply values on median by group in RR中的中位数乘以组
【发布时间】:2018-06-15 15:27:30
【问题描述】:

我有数据集

df=structure(list(SKU = c(11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L
), stuff = c(8.85947691, 9.450108704, 10.0407405, 10.0407405, 
10.63137229, 11.22200409, 11.22200409, 11.81263588, 12.40326767, 
12.40326767, 12.40326767, 12.99389947, 13.58453126, 14.17516306, 
14.76579485, 15.94705844, 17.12832203, 17.71895382, 21.26274458, 
25.98779894, 63.19760196), action = c(0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L), 
    acnumber = c(137L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 
    137L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 
    137L, 137L, 137L), year = c(2018L, 2018L, 2018L, 2018L, 2018L, 
    2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
    2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L)), .Names = c("SKU", 
"stuff", "action", "acnumber", "year"), class = "data.frame", row.names = c(NA, 
-21L))

action 列只有两个值 0 和 1。 正如我们所见,1 类的东西有 3 个观察值,0 类的东西有 18 个 obs。

我需要 -计算填充变量的中位数仅适用于类别 1(它等于 25.98779894),不带零。 正如我们所看到的,1 之间有零,它们需要被删除,如果存在负值,它们也需要被删除。 即,好像数据集是这样的:

structure(list(SKU = c(11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L
), stuff = c(8.85947691, 9.450108704, 10.0407405, 10.0407405, 
10.63137229, 11.22200409, 11.22200409, 11.81263588, 12.40326767, 
12.40326767, 12.40326767, 12.99389947, 13.58453126, 14.17516306, 
14.76579485, 15.94705844, 17.12832203, 17.71895382, 21.26274458, 
25.98779894, 63.19760196), action = c(0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, NA, NA, NA, NA, NA, NA, NA, NA, 1L, 1L), 
    acnumber = c(137L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 
    137L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 
    137L, 137L, 137L), year = c(2018L, 2018L, 2018L, 2018L, 2018L, 
    2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
    2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L)), .Names = c("SKU", 
"stuff", "action", "acnumber", "year"), class = "data.frame", row.names = c(NA, 
-21L))

我还需要通过 0 类的填充变量计算最后三个观察值的中位数,该变量在第一个之前, 在我们的例子中是 12,40326767

然后从类别 1 的中位数中减去类别 0 的中位数并乘以 1 的数量,在本例中为 3。

(25,98779894-12,40326767)*3=40,75359381

这个解决方案

df %>%
  group_by(SKU,acnumber,year) %>%
  summarize(value = 3*(median(stuff[action==1]) - median(stuff[match(1,action)-3:1])),
            stuff=first(stuff),
            action = sum(action)) %>%
  select(SKU,stuff,action,acnumber,year,value)

Moody_Mudskipper 帮助了我

但是!在这个例子中,动作的个数是三,所以我们乘以三, 但个数可以大于 3 或小于 3。 如何乘以实数? 例如,如果我们有 2 个按操作的东西,那么

summarize(value = 2*(median(stuff[action==1]) - median(stuff[match(1,action)-3:1])),

这样就不用每次都手动输入了。

解决方案 sum(df$action == 1)不适合

summarize(value = sum(df$action == 1)*(median(stuff[action==1]) - median(stuff[match(1,action)-3:1])),

因为它总结了所有数据集,然后乘法不正确。 个数的总数=692,这个数字成倍增长

 summarize(value = 692*(median(stuff[action==1]) - median(stuff[match(1,action)-3:1])),

错了 必须为每个特定组 SKU,acnumber,year 相乘

111-23-2018 is first group has 3 ones
112-24-2018 is second group has 2 ones

等等

如何正确处理?

【问题讨论】:

  • 要按组使用sum(action == 1) 获取实际数量 => 您需要删除df$ 部分

标签: r dplyr plyr lapply


【解决方案1】:
df%>%
   group_by(SKU,acnumber,year)%>%
   summarise(s=sum(action),k=which(action==1)[1],
            l=s*(median(stuff[action==1])-median(stuff[(k-s+1):k])))%>%
   data.frame()
    SKU acnumber year s  k        l
1 11202      137 2018 3 11 40.75359

【讨论】:

  • 请解释这个答案如何或为什么解决问题中的问题。
  • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
猜你喜欢
  • 2018-11-29
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多