2011-12-23 31 views
1

我有几个组,我们说A,B,C和我想cut基于这些组的另一个变量,即每个组对同一个变量都有特定的中断。在tapply中更改参数?

如果我不得不计算出平均团体,我倒是用tapply这样的:

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

不幸的是,我不知道如何与不断变化的休息= 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

你能构建一个小例子吗?现在还不清楚你希望'group'决定/指导cut()'断点的选择。 – 2011-12-23 15:22:40

+0

感谢您的评论,HTH。 – 2011-12-23 15:29:16

回答

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

因此,这是通过简单地grp分裂x和使用,每件不同的休息申请cut每件。

+0

此解决方案存在问题:我需要取消结果,因为我想再次将接收的因子添加到原始data.frame。通过unlisting我只是混合整理。 – 2011-12-23 15:37:52

+2

@ ran2然后我真的很困惑;使用不同的休息切割每件作品会产生不同程度的因素。如果你打算把它们重新组合成一个因素,你只能有一套关卡。 – joran 2011-12-23 15:41:10

+0

我明白了。老实说,我没有考虑到这一点。可能我不能使用因素。我使用这些中断作为大小类,这些类取决于数据所属的组。我的data.frame包含几个变量,这些变量汇总在一些结合了变量的特定程序中。我需要为每个大小类别分别执行聚合。所以,如果只有组和x变量被分裂分裂,它没有什么帮助。也许我的整个方法不太好。任何更好的想法? – 2011-12-23 15:50:32

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

好的,我明白了。你可能可以通过'asgeinte'强制每个片断然后'unlist'来在'mapply'的输出结果上得到相同的结果。很高兴你知道了,但。 – joran 2011-12-23 16:34:22

+0

没有你的评论,我可能会永远尝试和一天。根本没有想到限于一套因素水平 - 如果你知道的话,这是非常明显的。谢谢! – 2011-12-23 16:42:06