2015-11-23 2 views
0

Мой кадр данных выглядит следующим образомВсе возможные результаты

gen<-c("A","B","C") 
prob<-c("0.95","0.82","0.78") 
mw<-c("10","20","50") 
df<-data.frame(gen,prob,mw) 

gen prob mw 
1 A 0.95 10 
2 B 0.82 20 
3 C 0.78 50 

Теперь я хочу, чтобы все возможные результаты (A, B, C), (A, B), (A, C), (B, C), (A), (B), (C), (NONE) с вероятностями, например (A, B, C) = 0,95 * 0,82 * 0,78 = 0,60762.

trials <- data.frame(matrix(nrow=0,ncol=length(gen))) 
for(i in 1:length(gen)){ 
    trials.tmp <- t(combn(gen,i)) 
    trials <- rbind(trials,cbind(trials.tmp, matrix(nrow=nrow(trials.tmp),  
    ncol=length(gen)-i))) 
    } 
trials 

V1 V2 V3 
1 A <NA> <NA> 
2 B <NA> <NA> 
3 C <NA> <NA> 
4 A B <NA> 
5 A C <NA> 
6 B C <NA> 
7 A B C 

Но все же мне не хватает комбинации (NA, NA, NA). Как я могу создать новый фрейм данных со всеми результатами и вероятностями.

+0

Посмотрите в '' combn' и prod' функций и 'lapply' для зацикливания. – zx8754

+0

Все еще не знаете, как его использовать. – Mot4

ответ

2

вы можете попробовать combn как уже упоминалось zx8754, например

a=0.95 
b=0.82 
c=0.78 
x <- c(a,b,c) 
df <- rbind(t(combn(x, 3)), cbind(t(combn(x, 2)), NA), cbind(t(combn(x, 1)), NA, NA)) 
apply(df, 1, function(x) prod(x[!is.na(x)])) 
[1] 0.60762 0.77900 0.74100 0.63960 0.95000 0.82000 0.78000 
+0

Что такое 'combinat'? Этот код выглядит как «base» R. – nicola

+0

'combinat' предназначен для перестановок и комбинации элементов –

+0

@ Mot4 избегает задавать новые вопросы. Вначале это не было требованием. – zx8754

Смежные вопросы