1

我有几个组,比如说 A、B、C,我想要cut基于这些组的另一个变量,即每个组对同一个变量都有特定的中断。

如果我必须计算组的平均值,我会这样使用tapply

tapply(mydata$var,mydata$group,mean)

不幸的是,我不知道如何cut通过更改不同组的 break=c(...) 参数来解决此问题。

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))

等等...

4

2 回答 2

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,对每一块使用不同的中断。grpcut

于 2011-12-23T15:28:34.127 回答
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))) )
于 2011-12-23T16:07:42.093 回答