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