【问题标题】:Changing arguments in tapply?在tapply中改变参数?
【发布时间】:2011-12-23 15:11:16
【问题描述】:

我有几个组,比如说 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))

等等……

【问题讨论】:

  • 你能构造一个小例子吗?目前还不清楚您希望group 如何确定/指导cut() 断点的选择。

标签: r tapply


【解决方案1】:

我要在这里戴上我的读心帽,然后尝试一下你想要这样的东西:

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

所以这只是将xgrp 分开,然后将cut 应用到每个片段,并为每个片段使用不同的中断。

【讨论】:

  • 这个解决方案有一个问题:我需要取消列出结果,因为我想再次将接收到的因子添加到原始data.frame中。通过取消列出,我只是将排序混合在一起。
  • @ran2 那我真的很困惑;使用不同的休息时间切割每一块会产生不同水平的因素。如果要将它们重新组合成一个因素,则只能有一组级别。
  • 我明白了。老实说,我没有考虑到这一点。那时我可能无法使用因子。我将这些中断用作大小类,这些类取决于数据所属的组。我的 data.frame 包含几个变量,这些变量在结合其变量的某些特定过程中聚合。我需要为每个尺寸类别分别执行聚合。因此,如果只有 group 和 x 变量被 split 分割,它并没有多大帮助。也许我的整个方法不是那么好。有更好的想法吗?
  • +1 的读心速度比我提供的后期示例要快。乍一看,我似乎很快就会添加 acc
【解决方案2】:

实际上,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))) )

【讨论】:

  • 好的,我明白了。您可以通过使用as.integer 然后unlisting 强制每个部分来在mapply 的输出上获得相同的结果。不过,很高兴你想通了。
  • 如果没有您的评论,我可能会尝试永远和一天。根本没有考虑到被限制在一组因素水平上——如果你知道的话,这太明显了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2021-07-12
相关资源
最近更新 更多