2016-04-05 25 views
0

2 matrices var, onları bulmak için onları karşılaştır (row.name bilge). N1 rows.name birçoğu N2 oluğuyorFarklılıkları bulmak için matrisler karşılaştırın

> head(N1) 
       Total_Degree Transitivity Betweenness Closeness_All 
2410016O06RIK   1   NaN  0.00000 0.0003124024 
AGO1      4 0.1666667 37.00000 0.0003133814 
APEX1     4 0.6666667  4.00000 0.0003144654 
ATR      4 0.1666667 19.50000 0.0003128911 
CASP3     24 0.0000000 806.00000 0.0002980626 
CCND2     4 0.3333333 97.33333 0.0003132832 

head(N2) 
       Total_Degree Transitivity Betweenness Closeness_All 
2410016O06RIK   1   NaN   0.0 2.279982e-04 
ADI1      1   NaN   0.0 1.728877e-05 
AGO1      3 0.0000000  40.0 2.284670e-04 
AIRN      1   NaN   0.0 1.721733e-05 
APEX1     3 0.6666667   2.0 2.288330e-04 
ATR      3 0.3333333  19.5 2.281542e-04 

, onları karşılaştırmak ve yeni bir matris içinde farkı yazmak istiyorum. N1 veya N2'ye özgü olanların N1 veya N2'ye ait oldukları belirtilmelidir.

Farkı hesaplamak için en iyi ölçüt hangisi olduğunu düşündüğümden emin değilim, N1'deki bir satırın tüm değerlerinin basit bir eklenmesi ve bu değeri N2'deki karşılık gelen satırın katma değerinden çıkarmasıdır.

Örneğin çıkış olmalıdır:

Burada
> head(Compared) 
         Comparison Unique 
    2410016O06RIK  0.0002  Common 
    AGO1     -1.83  Common 
    APEX1     2.24  Common 
    ATR     0.0034  Common 
    CASP3    830.00029 N1 
    ADI1    1.0007288 N2 

row.name = 2410016O06RIK için, N1 ve N2 tüm değerler eklenmiş ve bu satır her iki matris yaygın olduğu gibi daha sonra N1-N2, Comparison sütun yazılmış commonUnique sütununda yazılmıştır.

+0

Verileri çoğaltmak için kod verebilir misiniz? Biriciklik için row.name ile iç ve sol/sağ birleşme ile gidip, sonuçta elde edilen üç data.frames'i buluruz ve fark için 'all.equal()' işi yapar mı? Bir "fark" ile ne demek istediğini belirtmelisin. –

+0

@ M.D Metin dosyalarını okuyorum, size nasıl veri sağlayabileceğimi bilmiyorum. Farktan "demek istiyorum ki, row.names'in farklı bir kişi olduğunu ve farklı kaynaklardan gelen gelirlerini farklı sütunlarda görelim. Toplam gelirlerini (bir satırın tüm değerlerini ekleyerek) 2 zaman noktasında (N1 ve N2) hesaplıyoruz ve Bu zaman noktalarında geliri büyük ölçüde değişmiş olan kişiyi bulmak (N1 - N2'yi çıkararak). – user3253470

+0

Bu, data.table paketini kullanarak bir çözüm taslağıdır, eğer aşina değilseniz, onu yeniden yazmayı deneyeceğim: (burada kod vardı, ancak okunabilirlik için bir çözüm olarak yayınlayacağım). –

cevap

4

rowSums ve merge ile taban Ar gitmek için bir yol:

N1 ise ve N2 olan data.frames: N1 ve N2 ise matrisler olan

# compute the row sums and merge N1 and N2 
N1$rs <- rowSums(N1, na.rm=TRUE) 
N2$rs <- rowSums(N2, na.rm=TRUE) 
comp <- merge(N1[, "rs", drop=FALSE], N2[, "rs", drop=FALSE], by="row.names", all=TRUE) 

# then compare the row sums and the variable "locations" 
comp$Unique <- with(comp, c("N1", "N2", "common")[(!is.na(rs.x)) + 2*(!is.na(rs.y))]) 
comp$Comparison <- with(comp, rs.x-rs.y) 

# keep only the variable you need: 
comp <- comp[, c(1, 5, 4)] 

:

Her iki yöntemin
# compute the row sums and merge N1 and N2 
rs1 <- rowSums(N1, na.rm=TRUE) 
rs2 <- rowSums(N2, na.rm=TRUE) 
comp <- merge(N1, N2, by="row.names", all=TRUE) 

# then compare the row sums and the variable "locations" 
comp$Unique <- with(comp, c("N1", "N2", "common")[as.numeric(!is.na(Total_Degree.x)) + 2*as.numeric(!is.na(Total_Degree.y))]) 
comp$Comparison <- with(merge(as.data.frame(rs1), as.data.frame(rs2), all=TRUE, by="row.names"), rs1-rs2) 

# keep only the variable you need: 
comp <- comp[, c("Row.names", "Comparison", "Unique")] 

çıktı: Bir data.table var res içinde çözümün bir parçasıdır

comp 
#  Row.names Comparison Unique 
#1 2410016O06RIK 0.0000844042 common 
#2   ADI1   NA  N2 
#3   AGO1 -1.8332483856 common 
#4   AIRN   NA  N2 
#5   APEX1 3.0000856324 common 
#6   ATR 0.8334181369 common 
#7   CASP3   NA  N1 
#8   CCND2   NA  N1 
+0

'comp <- birleştirme (N1 [," rs ", drop = FALSE], N2 [," rs ", drop = FALSE], by =" row.names ", tümü = TRUE)' Bu komut şöyle sonuçlanır: * * Hata N1 [, "rs", drop = FALSE]: yanlış boyut sayısı **. Bunu nasıl çözebileceğimi söyleyebilir misin? Cevap için teşekkürler. – user3253470

+0

Cevabınız için teşekkürler. Bu farklılıkları almak için matrisleri/data.frames'i karşılaştırmanın doğru yolu mu, yoksa başka yöntemler var mı? İkincisi, bana rehberlik edebilir misiniz gelecek sorulara nasıl veri sağlayabilirim? Gerçekten teşekkürler. – user3253470

+0

@ user3253470, en kolay soru: Ya yapısını bize vermek için küçük bir tekrarlanabilir kukla veri örneği oluşturabilir veya verilerinizin bir kısmında 'dput' kullanabilirsiniz. Diğer sorunuz için, sanırım ne tür bir bilgi peşinde olduğunuza bağlı. RowSums arasındaki fark anlamlı mı? Değişken-bilge bir farkın var mı? başka bir şey ? Gereksinim duyduğunuz şeyin tam olarak olduğunu söyleyebilirim ... – Cath

2

fark bölümü için çalışmak için:

require(data.table) 
require(dplyr) 

set.seed(2016) 
dt1 <- data.table(V1 = c("a", "b", "c", "d"), V2 = rnorm(4)) 
dt2 <- data.table(V1 = c("c", "d", "e", "f"), V2 = rnorm(4)) 

# common <- merge(dt1, dt2, by = "V1")[, Unique := "Common"] 
# unique1 <- dt1[V1 %nin% dt2[, V1], ][, Unique := "N1"] 
# unique2 <- dt2[V1 %nin% dt1[, V1], ][, Unique := "N2"] 
# res <- rbind(common, unique1, unique2, fill = TRUE) 

@Cath yanıtından sonra, sadece açıklık için küçük güncelleme.

allMerged <- merge(dt1, dt2, by = "V1", all = TRUE) %>% 
    .[, RowSum := rowSums(.SD, na.rm = TRUE), .SDcols = grep("V2", names(.))] %>% 
    .[, Unique := ((is.na(V2.x) + 2*is.na(V2.y)))] 

print(allMerged) 
+0

Cevabınız için teşekkür ederiz. – user3253470

+1

ah-ah, nedenini bilmediğimi (neden) gerçekten de istemediğimde 'as.numeric '' in.na 'testini koymak zorunda değildim, ama sadece dikkatli olmak meselesiydi ilk '!' tüm "cümle" :-) onu olumsuzlamadı – Cath

+1

Ben orada olacak, her bir ('in .na (V2.x)) 'wrap sarmak gerekir, eğer sen değil TRUE/FALSE'lerin mantıksal vektörüyle sonlandırın. Olmadan '' ', bu daha kolay olduğunu düşünüyorum. –

İlgili konular