2017-01-21 3 views
0

Я хотел бы создать определенные парные матрицы сравнения с использованием фреймов данных. Для этого у меня есть:Удаление сравнения нулей и doble в попарно конденсированной матрице

кадр данных с 5 продуктами (дельтаметрина, фипронил, имидаклоприд, sulfluramida, tiametoxam) и 2 inviduals нот (INDV)

Indv<-c(1,2)  
deltametrina<-c(1,1)  
fipronil<-c(5,3)  
imidaclopride<-c(7,5) 
sulfluramida<-c(3,7) 
tiametoxam<-c(9,9) 
DF<-cbind(Indv,deltametrina,fipronil,imidaclopride,sulfluramida,tiametoxam) 
DF 

После, я создаю парную матрицу сравнения, мое правило - это переменная с наивысшим значением минус меньшее числовое число каждой переменной. Но конечная матрица для каждого человека (Indv) в объекте списка.

df <- as.data.frame(t(DF[, -1])) 
out <- lapply(df, function(x) outer(x, x, function(x, y) abs(x-y))) 
out2 <- lapply(out, function(m) { 
    dimnames(m) <- list(rownames(df), rownames(df)) 
    m 
}) 

Финлей, я заказал матрицу в определенном формате:

out3 = list() 

for(i in seq(1,length(out2))) 
{ 
out3[[i]]=as.vector(out2[[i]]) 

names= 
paste(
rep(rownames(out2[[i]]),each=ncol(out2[[i]])), 
rep(colnames(out2[[i]]),nrow(out2[[i]])) 
,sep='_') 

names(out3[[i]])=names 

} 

[[1]] 
    deltametrina_deltametrina  deltametrina_fipronil deltametrina_imidaclopride 
          0       4       6 
    deltametrina_sulfluramida  deltametrina_tiametoxam  fipronil_deltametrina 
          2       8       4 
      fipronil_fipronil  fipronil_imidaclopride  fipronil_sulfluramida 
          0       2       2 
     fipronil_tiametoxam imidaclopride_deltametrina  imidaclopride_fipronil 
          4       6       2 
imidaclopride_imidaclopride imidaclopride_sulfluramida imidaclopride_tiametoxam 
          0       4       2 
    sulfluramida_deltametrina  sulfluramida_fipronil sulfluramida_imidaclopride 
          2       2       4 
    sulfluramida_sulfluramida  sulfluramida_tiametoxam  tiametoxam_deltametrina 
          0       6       8 
     tiametoxam_fipronil tiametoxam_imidaclopride  tiametoxam_sulfluramida 
          4       2       6 
     tiametoxam_tiametoxam 
          0 

[[2]] 
    deltametrina_deltametrina  deltametrina_fipronil deltametrina_imidaclopride 
          0       2       4 
    deltametrina_sulfluramida  deltametrina_tiametoxam  fipronil_deltametrina 
          6       8       2 
      fipronil_fipronil  fipronil_imidaclopride  fipronil_sulfluramida 
          0       2       4 
     fipronil_tiametoxam imidaclopride_deltametrina  imidaclopride_fipronil 
          6       4       2 
imidaclopride_imidaclopride imidaclopride_sulfluramida imidaclopride_tiametoxam 
          0       2       4 
    sulfluramida_deltametrina  sulfluramida_fipronil sulfluramida_imidaclopride 
          6       4       2 
    sulfluramida_sulfluramida  sulfluramida_tiametoxam  tiametoxam_deltametrina 
          0       2       8 
     tiametoxam_fipronil tiametoxam_imidaclopride  tiametoxam_sulfluramida 
          6       4       2 
     tiametoxam_tiametoxam 
          0 

Но я хотел бы создать окончательный Матриз без нулей и двойной comparasion как:

[[1]] 

- [deltametrina, fipronil, 4] 
- [deltametrina, imidaclopride, 6] 
- [deltametrina, sulfluramida, 2] 
- [deltametrina, tiametoxam, 8] 
- [fipronil, imidaclopride, 2] 
- [fipronil, sulfluramida, 2] 
- [fipronil, tiametoxam, 4] 
- [imidaclopride, sulfluramida, 4] 
- [imidaclopride, tiametoxam, 2] 
- [sulfluramida, tiametoxam, 6] 


[[2]] 

- [deltametrina, fipronil, 2] 
- [deltametrina, imidaclopride, 4] 
- [deltametrina, sulfluramida, 6] 
- [deltametrina, tiametoxam, 8] 
- [fipronil, imidaclopride, 2] 
- [fipronil, sulfluramida, 4] 
- [fipronil, tiametoxam, 6] 
- [imidaclopride, sulfluramida, 2] 
- [imidaclopride, tiametoxam, 4] 
- [sulfluramida, tiametoxam, 2] 

Это возможно? Спасибо

ответ

1

Вы можете попробовать это также (с out2):

library(reshape2) 
lapply(out2, function(x) {x <- as.matrix(x); 
          x[lower.tri(x, diag=FALSE)] <- 0; 
          df <- subset(melt(x), value>0); 
          df[order(df$Var1),]}) 

, чтобы получить выход:

$V1 
      Var1   Var2 value 
6 deltametrina  fipronil  4 
11 deltametrina imidaclopride  6 
16 deltametrina sulfluramida  2 
21 deltametrina tiametoxam  8 
12  fipronil imidaclopride  2 
17  fipronil sulfluramida  2 
22  fipronil tiametoxam  4 
18 imidaclopride sulfluramida  4 
23 imidaclopride tiametoxam  2 
24 sulfluramida tiametoxam  6 

$V2 
      Var1   Var2 value 
6 deltametrina  fipronil  2 
11 deltametrina imidaclopride  4 
16 deltametrina sulfluramida  6 
21 deltametrina tiametoxam  8 
12  fipronil imidaclopride  2 
17  fipronil sulfluramida  4 
22  fipronil tiametoxam  6 
18 imidaclopride sulfluramida  2 
23 imidaclopride tiametoxam  4 
24 sulfluramida tiametoxam  2 
+0

Спасибо большое Sandipan Дей !! – Leprechault

+0

@ Leprechault вас приветствуют. –

1

Ниже приведен список данных. Каждый набор имеет 20 строк, хотя результаты вашего примера показывают только 10. Я не знаю, какое правило применяется для уменьшения до 10. Я не очень много работаю с матрицами, поэтому я не уверен, какова должна быть конечная матричная структура.

library (reshape2) # for the melt function to make wide data frame narrow 
library(dplyr) # for simple sort and filter 

result <- lapply(out2, function(x) { 
    melt(x) %>% filter(value!=0) %>% arrange(Var1, Var2)}) 

> result 
$V1 
      Var1   Var2 value 
1 deltametrina  fipronil  4 
2 deltametrina imidaclopride  6 
3 deltametrina sulfluramida  2 
4 deltametrina tiametoxam  8 
5  fipronil deltametrina  4 
6  fipronil imidaclopride  2 
7  fipronil sulfluramida  2 
8  fipronil tiametoxam  4 
9 imidaclopride deltametrina  6 
10 imidaclopride  fipronil  2 
11 imidaclopride sulfluramida  4 
12 imidaclopride tiametoxam  2 
13 sulfluramida deltametrina  2 
14 sulfluramida  fipronil  2 
15 sulfluramida imidaclopride  4 
16 sulfluramida tiametoxam  6 
17 tiametoxam deltametrina  8 
18 tiametoxam  fipronil  4 
19 tiametoxam imidaclopride  2 
20 tiametoxam sulfluramida  6 

$V2 
      Var1   Var2 value 
1 deltametrina  fipronil  2 
2 deltametrina imidaclopride  4 
3 deltametrina sulfluramida  6 
4 deltametrina tiametoxam  8 
5  fipronil deltametrina  2 
6  fipronil imidaclopride  2 
7  fipronil sulfluramida  4 
8  fipronil tiametoxam  6 
9 imidaclopride deltametrina  4 
10 imidaclopride  fipronil  2 
11 imidaclopride sulfluramida  2 
12 imidaclopride tiametoxam  4 
13 sulfluramida deltametrina  6 
14 sulfluramida  fipronil  4 
15 sulfluramida imidaclopride  2 
16 sulfluramida tiametoxam  2 
17 tiametoxam deltametrina  8 
18 tiametoxam  fipronil  6 
19 tiametoxam imidaclopride  4 
20 tiametoxam sulfluramida  2 
Смежные вопросы