我有几个小组,比方说A,B,C和我希望cut
基于这些组的另一个变量,即每个组对同一个变量有特定的中断。
如果我必须计算群组的意思,我会像这样使用tapply
:
tapply(mydata$var,mydata$group,mean)
不幸的是,我不知道如何通过更改不同组的break = c(...)参数来解决cut
的问题。
tapply(mydata$var,mydata$group,cut)
有什么建议吗?我想用tapply
来做,但任何其他解决方案,但定制功能也适用。
编辑:一些小例子:
test <- data.frame(var=rnorm(100,0,1),
group=c(rep("A",30),
rep("B",20),
rep("C",50)))
# for group A:
cut(test$var,breaks=c(-4,0,4))
# for group B
cut(test$var,breaks=c(-4,1,4))
依旧......
答案 0 :(得分:2)
我要把我的思维读书帽放在这里,然后你想要这样的东西:
dat <- data.frame(x = runif(100),grp = rep(letters[1:3],length.out = 100))
mapply(cut,split(dat$x,dat$grp),list(c(-Inf,0.5,Inf),
c(-Inf,0.1,0.5,0.9,Inf),
c(-Inf,0.25,0.5,0.75,Inf)))
因此,这只是将x
分割为grp
并将cut
应用于每件作品,并为每件作品使用不同的间隔。
答案 1 :(得分:1)
实际上R在这里表现得非常聪明。我发现了一种解决方案,它的工作方式与我最初的想法相同虽然它没有使用apply
家族。不知何故R在这里创建了整数而不是因子 - 这就是为什么在这个解决方案中,像Joran提到的因素水平没有问题。
dat <- data.frame(x = rnorm(100),grp = rep(letters[1:3],length.out = 100))
ifelse(dat$grp == "a",cut(dat$x,breaks=c(-Inf,0.1,0.2,Inf)),
ifelse(dat$grp == "b",cut(dat$x,breaks=c(-Inf,0.1,1,Inf)),
cut(dat$x,breaks=c(-Inf,0.9,2,Inf))) )