2017-10-04 107 views
5

Verilerimden kare kare matris yapmakta sorun yaşıyorum.Veri çerçevesinden kare matris oluşturma

var1 var2 value 
    A B  4 
    C D  5 
    D A  2 
    B D  1 

ben şöyle bir matrise data.frame dönüştürmeye çalışıyorum: Ben mevcut farklı paketten birçok işlevi çalıştı

A B C D 
    A 0 4 0 2 
    B 4 0 0 1 
    C 0 0 0 5 
    D 2 1 5 0 

Şimdi verilerim şuna benzer R'de hala bir çözüm bulamıyor.

+0

sen denedi o birçok işlevi sonrası Lütfen ve – PoGibas

+1

'xtabs (değer ~ var1 + var2'yi, df)' işe yaramadı neden? – Sotos

+1

@Sotos 'C' ' – PoGibas

cevap

3

factor s karakter sütunlarını 'A', 'B', 'C', 'D' düzeyleriyle yaparsak, herhangi bir sütun bırakmadan xtabs'u kullanabiliriz.

Ne yazık ki, sonuç matrisi simetrik değil.

library('tidyverse') 

df <- tribble(
    ~var1, ~var2, ~value, 
    'A', 'B',  4, 
    'C', 'D',  5, 
    'D', 'A',  2, 
    'B', 'D',  1 
) 

df %>% 
    mutate_if(is.character, factor, levels=c('A', 'B', 'C', 'D')) %>% 
    xtabs(value ~ var1 + var2, ., drop.unused.levels = F) 
#  var2 
# var1 A B C D 
# A 0 4 0 0 
# B 0 0 0 1 
# C 0 0 0 5 
# D 2 0 0 0 

Simetrik hale getirmek için, kendi aktarımını kendime ekledim. Yine de bu bir kesmek gibi geliyor.

df %>% 
    mutate_if(is.character, factor, levels=c('A', 'B', 'C', 'D')) %>% 
    xtabs(value ~ var1 + var2, ., drop.unused.levels = F) %>% 
    '+'(., t(.)) 
#  var2 
# var1 A B C D 
# A 0 4 0 2 
# B 4 0 0 1 
# C 0 0 0 5 
# D 2 1 5 0 
+0

"Bu gibi hissettiriyor bir "kesmek" olsa da, "- çok iyi çözümler hakkında söylenebilecek bir şey var. R. +1 –

+0

@Paul. Ama aslında, bir sorunum var çünkü değişkenlerimi bir veri çerçevesinde saklıyorum. 'df <- tribble (~ var1, ~ var2, ~ puan, data3 $ var1, data3 $ var2, data3 $ puan) df%>% mutate_if (is.character, factor, levels = c ('data3 $ var1' , 'data3 $ var2'))%>% xtabs (puan ~ var1 + var2,., drop.unused.levels = F)%>% '+' (., t (.)) ' – Brenna

+0

Kullandığınız yol 'tribble' liste sütunları ile sonuçlanacaktır. Sadece data3%>% mutate_if (is.karakter, faktör, düzeyler = c ('A', 'B', 'C', 'D'))%>% xtabs (puan ~ var1 + var2,., drop.unused.levels = F)%>% ' + '(., t (.)) ' – Paul

3

Karakter vektörlerinde matris indekslemeyi kullanan bir temel R yöntemi.

## set up matrix 
# get names for row and columns 
nameVals <- sort(unique(unlist(dat[1:2]))) 
# construct 0 matrix of correct dimensions with row and column names 
myMat <- matrix(0, length(nameVals), length(nameVals), dimnames = list(nameVals, nameVals)) 

# fill in the matrix with matrix indexing on row and column names 
myMat[as.matrix(dat[c("var1", "var2")])] <- dat[["value"]] 

Bu, bu endeksleme nasıl çalıştığı hakkında ayrıntılı bilgi için

myMat 
    A B C D 
A 0 4 0 0 
B 0 0 0 1 
C 0 0 0 5 
D 2 0 0 0 

döndürür Matrisler ve diziler yardım dosyası ?"[" ait bölümüne bakın. Dördüncü fıkra burada bu endeksleme biçimini tartışmaktadır.

İlk iki değişkenin, daha sonra faktörlerden ziyade karakter vektörleri olduğunu varsayalım. Bu onları biraz daha kolaylaştırır, çünkü onları zorlamak için as.character kullanmam gerekmez.

Sonucu bir data.frame dosyasına dönüştürmek için as.data.frame ürününe basitçe sarın.

veri

dat <- 
structure(list(var1 = c("A", "C", "D", "B"), var2 = c("B", "D", 
"A", "D"), value = c(4L, 5L, 2L, 1L)), .Names = c("var1", "var2", 
"value"), class = "data.frame", row.names = c(NA, -4L))