2016-05-20 3 views
0

У меня есть некоторые данные, где мы применяем несколько тестов (называемых параметрами) к разным «die», и каждый «die» может либо пройти, либо пропустить данный тест.Использование функции tap, которая имеет несколько выходов

Вот небольшая часть из dataframe имени 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 

Если я предоставил полный набор данных, вы увидите несколько кубик (пронумерованных 1,2,3, ...), многие другие разные параметров, а при первом сбое вы увидите FALSE (die die) или TRUE (die failed), а иногда 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. Как я могу получить данные в dataframe, который является более читаемым? Что-то вроде этого: 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. Как я могу отсортировать параметры в этой структуре данных в первоначальном порядке?

Спасибо!

+0

Я не пробовал чтения в вашем примере данных, но, возможно, 'lapply (сплит (alldie $ firstfailure, alldie параметр $) , ly) 'больше того, что вам нужно ... или просто установите' tapply' 'option simplify = FALSE (что, вероятно, делает то же самое) – Frank

+0

Спасибо, Фрэнк, но это дает ответы, как и раньше, в отношении такой же относительно непроницаемый и труднодоступный результат. –

+1

Хорошо, я понимаю, что тебе нужно. Одна из проблем заключается в том, что имена столбцов не могут быть автоматически генерированы. Вероятно, вы захотите изменить свою функцию, чтобы вернуть что-то с именованными аргументами 'c (npass = npass, ...)'. При этом вы можете 'do.call (rbind, lim_yld)'. Если вы открыты для пакетов, есть более простые способы сделать этот материал split-apply-comb. – Frank

ответ

1

Как насчет этого решения. Возьмите результат отпечатка и конвертируйте в кадр данных. Добавить заголовки столбцов и имена параметров:

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