将函数应用于按因子分组的向量并返回逻辑值

时间:2014-04-02 15:12:43

标签: r

我有以下df

df <- data.frame(group=c("a","a","a","b","b","b","b","b","c","c","c","c"), 
                 length=c(1.2,1.4,1.1,1.0,2.1,1.4,1.3,1.3,1.1,1.0,1.8,1.4),
                 weight = c(.3,.2,.3,.5,.7,.4,.3,.4,.7,.8,.4,.1))

我希望能够根据最小&#34;权重&#34;生成相同长度的逻辑向量。每个&#34;组&#34;的价值。对于上面的例子,结果应该是

[1] FALSE TRUE FALSE  FALSE  FALSE  FALSE TRUE  FALSE  FALSE  FALSE  FALSE TRUE

如果可能问题很简单,我道歉,但我无法解决这个问题。

2 个答案:

答案 0 :(得分:1)

尝试ave(有关详细信息,请参阅?ave):

d <- ave(df$weight, df$group, FUN=function(x){min(x) == x})
d
# [1] 0 1 0 0 0 0 1 0 0 0 0 1
as.logical(d)
# [1] FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE

答案 1 :(得分:1)

您可以编写一个简短的is.min函数(如果您涉及到这类内容),然后将byis.min一起使用。

这有点类似于@sgibb给出的答案。实际上,自is.min编辑以来,它几乎完全相同。但我会留在这里,以防您从未见过unlistwith和/或by

> is.min <- function(x){ x == min(x) }
> unlist(with(df, by(weight, group, is.min)))
##    a1    a2    a3    b1    b2    b3    b4    b5    c1    c2    c3    c4 
## FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE