问题:
如何以矢量化方式将函数应用于数据子集。
示例:
对于以下数据框:
x=c(1,2,1,2,1,2)
y=c(3,4,5,4,3,2)
df=data.frame(x,y)
我想将函数(即min())应用于每个x值的所有y值,并将其收集在向量中。
基本上,我希望有一个矢量化版本:
nb = max(x);
V = rep(0.0, nb)
for(i in 1:nb){
v = df [ x == i, ]$y;
V[i] <- min(v);
}
# basically here:
# V[1] = min( df$y for x=1)
# V[2] = min( df$y for x=2)
答案 0 :(得分:3)
函数tapply
专为此类问题而设计:
with(df,tapply(y,x,FUN=min))
#1 2
#3 2
如果要将结果添加到数据框,可以使用函数ave
:
df$group.min <- with(df,ave(y,x,FUN=min))
# x y group.min
# 1 1 3 3
# 2 2 4 2
# 3 1 5 3
# 4 2 4 2
# 5 1 3 3
# 6 2 2 2