मैं निम्नलिखित डेटा (यादृच्छिक रूप से उत्पन्न) के लिए एक सह-घटना मैट्रिक्स बनाना चाहता हूं:

         OTU1 OTU2 OTU3 OTU4 .... OTU598
patient1  0    1    1    0        1    
patient2  1    0    1    0        1 
.
.
.
patient143 1   0    1    1         1

मैं निम्नलिखित तीन स्तंभों के साथ एक सह-घटना मैट्रिक्स बनाना चाहता हूं: (एक रोगी): पहले ओटू पर विचार करें और अन्य सभी ओटीयू के साथ तुलना करें। यदि दो ओटीयू (जैसे: ओटीयू1 और ओटीयू2) में 1 है, तो मैं काउंट्स नामक एक कॉलम बनाना चाहता हूं और 1 डालता हूं।

otu1    otu2    counts
OTU1    OTU2      0
OTU1    OTU3      0
OTU1    OTU4      0
OTU2    OTU1      0
OTU2    OTU3      1

तो मैंने निम्नलिखित कोड की कोशिश की:

a <- apply(bin_OTU_tab,1,function(row_val) lapply(1:ncol(bin_OTU_tab), 
                                              function(i){ lapply(i:ncol(bin_OTU_tab),
                                                                  function(j){if(bin_OTU_tab[row_val,i] == 1&&bin_OTU_tab[row_val,j] == 1){return(1) }else{return(0)
                                                                    }})}))

यह मैट्रिक्स प्रारूप में है। मैं इस मैट्रिक्स को डेटाफ्रेम में बदलना चाहता हूं और वांछित आउटपुट (जैसा ऊपर बताया गया है) के रूप में व्यवस्थित करना चाहता हूं। मुझे आशा है कि rbind काम करेगा? लेकिन समझ नहीं आ रहा था कि यहां से कैसे आगे बढ़ना है। क्या कोई मुझे इसमें मार्गदर्शन कर सकता है?

0
MSM 26 नवम्बर 2019, 18:37
कृपया अपने डेटा का एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण प्रदान करें
 – 
sindri_baldur
26 नवम्बर 2019, 18:51

2 जवाब

सबसे बढ़िया उत्तर

यह मैट्रिक्स की एक सूची देता है, प्रत्येक रोगी के लिए एक:

# fake data
set.seed(47)
m = matrix(round(runif(15)), nrow = 3)
colnames(m) = paste0("OTU", 1:ncol(m))
m
#      OTU1 OTU2 OTU3 OTU4 OTU5
# [1,]    1    1    0    1    0
# [2,]    0    1    0    0    1
# [3,]    1    1    1    1    1

template = as.data.frame(t(combn(colnames(m), 2)))
names(template) = c("otu1", "otu2")
template$counts = 0

result = apply(m, 1, function(x) {
  ones = names(x)[x == 1]
  result = template
  result[result$otu1 %in% ones & result$otu2 %in% ones, "counts"] = 1 
  return(result)
})

result
# [[1]]
#    otu1 otu2 counts
# 1  OTU1 OTU2      1
# 2  OTU1 OTU3      0
# 3  OTU1 OTU4      1
# 4  OTU1 OTU5      0
# 5  OTU2 OTU3      0
# 6  OTU2 OTU4      1
# 7  OTU2 OTU5      0
# 8  OTU3 OTU4      0
# 9  OTU3 OTU5      0
# 10 OTU4 OTU5      0
# 
# [[2]]
#    otu1 otu2 counts
# 1  OTU1 OTU2      0
# 2  OTU1 OTU3      0
# 3  OTU1 OTU4      0
# 4  OTU1 OTU5      0
# 5  OTU2 OTU3      0
# 6  OTU2 OTU4      0
# 7  OTU2 OTU5      1
# 8  OTU3 OTU4      0
# 9  OTU3 OTU5      0
# 10 OTU4 OTU5      0
# 
# [[3]]
#    otu1 otu2 counts
# 1  OTU1 OTU2      1
# 2  OTU1 OTU3      1
# 3  OTU1 OTU4      1
# 4  OTU1 OTU5      1
# 5  OTU2 OTU3      1
# 6  OTU2 OTU4      1
# 7  OTU2 OTU5      1
# 8  OTU3 OTU4      1
# 9  OTU3 OTU5      1
# 10 OTU4 OTU5      1
1
Gregor Thomas 26 नवम्बर 2019, 20:56
यह समाधान देने के लिए आपके समय के लिए धन्यवाद। दोबारा, मैं प्रत्येक रोगी के लिए मैट्रिक्स आउटपुट करने का प्रयास कर रहा हूं। मैं इसे कैसे लूं?
 – 
MSM
26 नवम्बर 2019, 20:32
ओह, मैंने सोचा था कि आप केवल एक रोगी के लिए उदाहरण तैयार कर रहे थे, यह नहीं कि आप प्रत्येक रोगी को व्यक्तिगत रूप से करना चाहते थे। अभी अपडेट करने का समय नहीं है, क्षमा करें। मैं बाद में फिर से देखूंगा
 – 
Gregor Thomas
26 नवम्बर 2019, 20:38
जवाब देने के लिए धन्यवाद। मैं वांछित आउटपुट प्राप्त करने के लिए अलग-अलग दृष्टिकोण का भी प्रयास कर रहा हूं।
 – 
MSM
26 नवम्बर 2019, 20:47

यदि आप base R का उपयोग कर रहे हैं, तो निम्न कोड कुछ ऐसा हो सकता है जो आप चाहते हैं

l <- apply(m, 1, function(v) 
  setNames(data.frame(cbind(t(combn(colnames(m),2)),(M <- outer(v,v,"*"))[lower.tri(M)])), 
           c("otu1","otu2","counts")))

उपज

> l
$patient1
   otu1 otu2 counts
1  OTU1 OTU2      0
2  OTU1 OTU3      0
3  OTU1 OTU4      0
4  OTU1 OTU5      0
5  OTU2 OTU3      0
6  OTU2 OTU4      0
7  OTU2 OTU5      0
8  OTU3 OTU4      0
9  OTU3 OTU5      0
10 OTU4 OTU5      1

$patient2
   otu1 otu2 counts
1  OTU1 OTU2      0
2  OTU1 OTU3      0
3  OTU1 OTU4      0
4  OTU1 OTU5      0
5  OTU2 OTU3      0
6  OTU2 OTU4      0
7  OTU2 OTU5      0
8  OTU3 OTU4      0
9  OTU3 OTU5      0
10 OTU4 OTU5      0

$patient3
   otu1 otu2 counts
1  OTU1 OTU2      0
2  OTU1 OTU3      0
3  OTU1 OTU4      0
4  OTU1 OTU5      0
5  OTU2 OTU3      1
6  OTU2 OTU4      1
7  OTU2 OTU5      0
8  OTU3 OTU4      1
9  OTU3 OTU5      0
10 OTU4 OTU5      0

$patient4
   otu1 otu2 counts
1  OTU1 OTU2      1
2  OTU1 OTU3      1
3  OTU1 OTU4      0
4  OTU1 OTU5      0
5  OTU2 OTU3      1
6  OTU2 OTU4      0
7  OTU2 OTU5      0
8  OTU3 OTU4      0
9  OTU3 OTU5      0
10 OTU4 OTU5      0

डेटा

m <- structure(c(0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 
0, 0, 0), .Dim = 4:5, .Dimnames = list(c("patient1", "patient2", 
"patient3", "patient4"), c("OTU1", "OTU2", "OTU3", "OTU4", "OTU5"
)))
0
ThomasIsCoding 27 नवम्बर 2019, 06:51
समाधान के लिए धन्यवाद। मैं इसे करने की कोशिश की। लेकिन मैं प्रत्येक रोगी के लिए अलग आउटपुट कैसे प्राप्त करूं?
 – 
MSM
26 नवम्बर 2019, 20:31
अब मुझे पता है कि by patient के लिए आपका क्या मतलब था...कृपया मेरा अद्यतन समाधान देखें
 – 
ThomasIsCoding
26 नवम्बर 2019, 22:59
खेद है कि मेरे कोड में एक टाइपो था, लेकिन अब यह सही है।
 – 
ThomasIsCoding
27 नवम्बर 2019, 06:52