【问题标题】:Using tapply on Function that has multiple outputs在具有多个输出的函数上使用 tapply
【发布时间】:2016-05-20 18:07:02
【问题描述】:

我有一些数据,我们将多个测试(称为参数)应用于不同的“模具”,每个“模具”可以通过或失败给定的测试。

这是名为 alldie 的数据帧的一小部分

    die                        parameter firstfailure
1     1 Resistance_Test DevID (Ohms) 428        FALSE
2     1         Diode_Test SUBLo (V) 353        FALSE
3     1        Gate_Test V1_WELL (V) 361        FALSE
4     1        Gate_Test V2_WELL (V) 360        FALSE
5     1        Gate_Test V3_WELL (V) 361        FALSE
6     1  Class_Test Cluster Class2 (#) 6        FALSE
7     1   Class_Test Column Class1 (#) 2         TRUE
8     1  Class_Test Cluster Class1 (#) 2           NA

如果我提供了完整的数据集,您会看到多个 die(编号为 1、2、3、...)、更多不同的参数,并且在 firstfailure 下,您会看到 FALSE(die 通过)或 TRUE(die失败),如果未执行测试,偶尔会出现 NA。

我想我可以通过编写一个函数然后使用tapply来计算通过每个测试(参数)的骰子数量、通过的数量和通过的比例。

ly <- function(data) {
  ndie <- sum(!is.na(data))
  npass <- ndie - sum(data,na.rm = TRUE)
  yield <- npass / ndie
  c(npass,ndie,yield)
}

这会进行我想要的计算,但会产生一些难以使用的输出

tapply(alldie$firstfailure, alldie$parameter, ly)) -> lim_yld

然后 lim_yld 看起来像(仅前几行,并且tapply 将参数按字母顺序排列)

$`Class_Test Cluster Class1 (#) 2`
[1] 76 76  1

$`Class_Test Cluster Class2 (#) 6`
[1] 89 89  1

$`Class_Test Column Class1 (#) 2`
[1] 76.0000000 89.0000000  0.8539326

问题:

  1. 如何将数据放入更具可读性的数据框中?像这样的东西: Parameter Npass Ndie Proportion Class_Test Cluster Class1 (#) 2 76 76 1.0000000 Class_Test Cluster Class2 (#) 6 89 89 1.0000000 Class_Test Column Class1 (#) 2 76 89 0.8539326

  2. 如何按原始顺序对这个数据框中的参数进行排序?

谢谢!

【问题讨论】:

  • 我还没有尝试阅读您的示例数据,但也许lapply(split(alldie$firstfailure, alldie$parameter), ly) 是您所追求的更多...或者只是设置tapply 的`option simple=FALSE做同样的事情)
  • 谢谢,弗兰克,但这给出的答案和以前一样,相对不可读且难以使用。
  • 好的,我明白你在追求什么。一个问题是无法自动生成列名。您可能想要更改您的函数以返回带有命名参数c(npass = npass, ...) 的内容。有了它,你可以do.call(rbind, lim_yld)。如果您对软件包持开放态度,有更简单的方法来完成这种拆分-应用-组合的工作。
  • 好了,结果的外观有了很大的提升!鉴于我知道参数的原始顺序,我现在可以按该顺序对表格进行排序吗?看来参数名称是行标签而不是数据框中的实际列,对吗,这似乎暗示我无法对参数名称进行排序?
  • res[ order(alldie$parameter), ] 是你所追求的,我想。

标签: r tapply


【解决方案1】:

这个解决方案怎么样。获取 tapply 的结果并转换为数据框。添加列标题和参数名称:

df<-as.data.frame(matrix(unlist(lim_yld), ncol=3, byrow=TRUE))
names(df)<-c("npass","ndie","yield")
df<-cbind(parameter=names(lim_yld), df)

正如上面提到的 cmets 在列名方面不是很通用,但它确实与您的函数返回一致。看来tapply正在返回列表是反向的,但以防万一这应该工作:

df<-df[order(df$parameter, alldie$parameter ),]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多