我recently遇到了以下分组操作:对于每个组,值在-0.5和0.5之间分配均匀分布的数字,如果该组只有一个元素,则为其分配值0.例如,如果我有以下观察组:
g <- c("A", "A", "B", "B", "A", "C")
然后我希望分配值:
outcome <- c(-0.5, 0, -0.5, 0.5, 0.5, 0)
A组中的三个观察值分别为-0.5,0和0.5(按顺序),B组中的两个观察值分别为-0.5和0.5(按顺序),C组中的一个观察值为赋值0.
通常,当我对一个向量执行分组操作以获取另一个向量时,我使用ave
函数,格式为ave(data.vector, group.vector, FUN=function.to.apply.to.each.groups.data.vector.subset)
。但是,在此操作中,我需要知道的是组中的成员数,因此没有data.vector
。结果,我最终只是编造了一个我在调用ave
时忽略的数据向量:
ave(rep(NA, length(g)), g, FUN=function(x) {
if (length(x) == 1) {
return(0)
} else {
return(seq(-0.5, 0.5, length=length(x)))
}
})
# [1] -0.5 0.0 -0.5 0.5 0.5 0.0
虽然这给了我正确的答案,但显然需要编制一个我忽略的数据向量是非常不满意的。当所有重要的是组中元素的数量时,是否有更好的方法按组分配值?
答案 0 :(得分:2)
从评论来看,似乎不存在ave
的版本仅仅使用组和使用每个组中的元素数量调用的函数。我想这并不特别令人惊讶,因为它是一个非常专业的操作。
如果我经常这样做,我可以使用所需的属性滚动我自己的ave
版本作为ave
的薄包装:
ave.len <- function(..., FUN) {
l <- list(...)
do.call("ave", c(list(x=rep(NA, length(l[[1]]))), l, FUN=function(x) FUN(length(x))))
}
# Original operation, using @akrun's 1-line command for sequences
g <- c("A", "A", "B", "B", "A", "C")
ave.len(g, FUN=function(n) seq(-0.5, 0.5, length=n)* (n!=1)+0L)
# [1] -0.5 0.0 -0.5 0.5 0.5 0.0
# Group of size n has the n^th letter in the alphabet
ave.len(g, FUN=function(n) rep(letters[n], n))
# [1] "c" "c" "b" "b" "c" "a"
# Multiple groups via the ... argument (here everything's in own group)
ave.len(g, 1:6, FUN=function(n) rep(letters[n], n))
# [1] "a" "a" "a" "a" "a" "a"