在具有多个输出的函数上使用tapply

时间:2016-05-20 18:07:03

标签: r tapply

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

以下是名为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(传递死亡)或TRUE(死亡)失败了)如果没有进行测试,偶尔会有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. 如何按原始顺序对此数据框中的参数进行排序?

  3. 谢谢!

1 个答案:

答案 0 :(得分: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)

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

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