我已经有了一看here,其中使用cut
功能。但是,我一直没能拿出给我的情况聪明的解决方案。
首先是一些示例数据,我目前有:
df <- data.frame(Category = LETTERS[1:20]
, Nber_within_category = c(rep(1,8), rep(2,3), rep(6,2), rep(10,3), 30, 50, 77, 90)
)
我想就形成基础上,Nber_within_category
列一个新的类别第三列。在这个例子中,我怎么能做出如Category_new
使得在每个类别中,Nber_within_category
是至少5,如果Category
已有Nber_within_category >= 5
,原始类别采取的约束。
因此,例如,它应该是这样的:
df <- data.frame(Category = LETTERS[1:20]
, Nber_within_category = c(rep(1,8), rep(2,3), rep(6,2), rep(10,3), 30, 50, 77, 90)
, Category_new = c(rep('a',5), rep('b', 4), rep('c',2), LETTERS[12:20])
)
这是一个黑客攻击的一位,但它的工作原理:
df %>%
mutate(tmp = floor((cumsum(Nber_within_category) - 1)/5)) %>%
mutate(new_category = ifelse(Nber_within_category >= 5,
Category,
letters[tmp+1]))
该生产线floor((cumsum(Nber_within_category) - 1)/5)
是大小5箱(-1至包括其中的总和正好是5行)的分类的cumsum的方式,和我使用的指标即得到该行,其中Nber_within_category < 5
新的类别
它可能会更容易理解列tmp
是如何定义的,如果你运行:
x <- 1:100
data.frame(x, y = floor((x- 1)/5))