我在R中编写脚本时遇到了困难。
我想要的是:
如果Percentile列中的值大于或等于0.95,并且该值同时最接近0.95(所以如果有两个值表示0.98和0.99那么我会对0.98感兴趣,因为它是接近0.95)然后将针对该prodcode的值出现的发票价格引入列MinPercentile> = 0.95。因此,查看表格4.19是百分位数0.956的发票价格,最接近0.95。
同样的规则适用于其他两列虽然只有价值标准不同,但我们正在考虑> = 0.80和> = 0.60并再次需要将最接近0.60和0.80百分位值的发票价格带入我的MinPercentile> = 0.80和MinPercentile> = 0.60列。
理想情况下,我希望在产品代码级别创建表2,该表是表1的汇总,符合我的标准。我希望这是有道理的。我真的很感激你的帮助。
感谢您的努力。
答案 0 :(得分:0)
dplyr
和tidyr
:
dat <- data.frame(prod = c(rep('A', 9), rep('B', 3)),
perc = c(.1, .2, .3, .36, .61, .8, .946, .956, .97, .3, .81, .98),
price = runif(12, min = 2, max = 4))
dat %>%
# Group by product and percentile range
group_by(prod,
group = cut(perc,
breaks = c(.6, .8, .95, 1),
labels = c('Perc6', 'Perc8', 'Perc95')
)
) %>%
# Make sure percentile are sorted in each group
arrange(perc) %>%
# Take just the first
slice(1) %>%
# Drop percentile column
select(-perc) %>%
# Format as desired
spread(group, price)
Source: local data frame [2 x 5]
Groups: prod [2]
prod Perc6 Perc8 Perc95 `<NA>`
* <fctr> <dbl> <dbl> <dbl> <dbl>
1 A 2.633812 2.020161 3.505599 2.067004
2 B NA 2.709279 2.126438 3.586837
请注意,它并没有达到您所要求的,因为它会将“百分位数”划分为“硬”。组。例如:对于产品B,Perc> =。6将是NA,因为在.6和.8之间没有记录,它将仅填充Perc&gt; =。8。
它还会有一个“NA”。它列出了最低百分位数的值。你可以放弃它。
可能有更好,更有效的方法来实现这一点,这是我想到的第一件事。