2016-12-18 23 views
6

Bazı ağ görselleştirme tekniklerini test etmekle ilgileniyorum, ancak bu işlevleri denemeden önce, aşağıdaki gibi bir veri tabanı kullanarak bir bitişik matris oluşturmak istiyorum.r Bir veri çerçevesindeki sütunlardan bir bitişiklik matrisi oluşturma

Id Gender Col_Cold_1 Col_Cold_2 Col_Cold_3 Col_Hot_1 Col_Hot_2 Col_Hot_3 
10 F   pain  sleep  NA   infection medication walking 
14 F   Bump  NA   muscle  NA   twitching flutter 
17 M     pain   hemoloma Callus  infection 
18 F   muscle     pain     twitching medication 

Amacım, pain, sleep, Bump, muscle, hemaloma anahtar kelime Soğuk ile sütunların altında hücre değerleri ve onlar gibi satır ve hücre değerlerini oluşturacak Örneğin

1) All values in columns with keyword Cold will contribute to the rows 
2) All values in columns with keyword Hot will contribute to the columns 

şöyle bir bitişiklik matrisi oluşturmaktır infection, medication, Callus, walking, twitching, flutter, Hot anahtar sözcükleriyle sütunların altındadır ve bu, ilişkilendirme matrisinin sütunlarını oluşturacaktır.

arzu edilen nihai çıktısı aşağıdaki gibi görünmelidir:

  infection medication walking twitching flutter Callus 
    pain 2   2   1  1     1 
    sleep 1   1   1 
    Bump         1   1 
    muscle    1     1 
hemaloma 1             1 
  • [pain, infection] = 2 ağrı ve enfeksiyon arasındaki ilişki, orijinal dataframe iki kez oluşur: satır 3 kez daha satır 1 ve.

  • [pain, medication] = 2, ağrı ve ilaç arasındaki ilişki satır 1 iki kez olduğu ve daha üst üste çünkü 4.

Böyle bir ilişkilendirme matrisini oluşturmaya yönelik herhangi bir öneri veya öneriniz için teşekkür ederiz.

tekrarlanabilir Veri kümesi

df = structure(list(id = c(10, 14, 17, 18), Gender = structure(c(1L, 1L, 2L, 1L), .Label = c("F", "M"), class = "factor"), Col_Cold_1 = structure(c(4L, 2L, 1L, 3L), .Label = c("", "Bump", "muscle", "pain"), class = "factor"), Col_Cold_2 = structure(c(4L, 2L, 3L, 1L), .Label = c("", "NA", "pain", "sleep"), class = "factor"), Col_Cold_3 = structure(c(1L, 3L, 2L, 4L), .Label = c("NA", "hemaloma", "muscle", "pain"), class = "factor"), Col_Hot_1 = structure(c(4L, 3L, 2L, 1L), .Label = c("", "Callus", "NA", "infection"), class = "factor"), Col_Hot_2 = structure(c(2L, 3L, 1L, 3L), .Label = c("infection", "medication", "twitching"), class = "factor"), Col_Hot_3 = structure(c(4L, 2L, 1L, 3L), .Label = c("", "flutter", "medication", "walking"), class = "factor")), .Names = c("id", "Gender", "Col_Cold_1", "Col_Cold_2", "Col_Cold_3", "Col_Hot_1", "Col_Hot_2", "Col_Hot_3"), row.names = c(NA, -4L), class = "data.frame") 
+1

zaten bitişiklik matrisleri oluşturma konusunda bilgi bir ton var: [on] (http://stackoverflow.com

out # cold hot # 1 pain infection # 2 Bump <NA> # 3 <NA> Callus # 4 muscle <NA> # 5 pain medication # ... 

Son olarak, istenilen çıktıyı yapmak için xtabs kullanmak/a/14850986/1152809), [iki] (https://www.r-bloggers.com/graph-from-sparse-adjacency-matrix/), [three (pdf)] (https://www.google com/uRL Sa = t RCT = j q = & ESRC = s ve kaynak = web ve cD = 11 & ved = 0ahUKEwimt5nt-P7QAhVr64MKHUdpDgEQFghWMAo ve uRL = http% 3A% 2F% 2Fwww.londonr.org% 2Fdownload% 2F% 3Fid% 3D97 ve USG = AFQjCNFemmTxQFHFidF4mzLWZWw43yuqmA & sig2 = SC6hY1bLpOjmiEwvsxOfUw). Ne denedin? Çalışılan –

cevap

1

Tek yön xtabs kullanmak sonra, bir "derli toplu" forma veri kümesi yapmaktır. İlk olarak, bazı temizlik:

df[] <- lapply(df, as.character) # Convert factors to characters 
df[df == "NA" | df == "" | is.na(df)] <- NA # Make all blanks NAs 

Şimdi, düzenli veri kümesi:

library(tidyr) 
library(dplyr) 
out <- do.call(rbind, sapply(grep("^Col_Cold", names(df), value = T), function(x){ 
    vars <- c(x, grep("^Col_Hot", names(df), value = T)) 
    setNames(gather_(select(df, one_of(vars)), 
    key_col = x, 
    value_col = "value", 
    gather_cols = vars[-1])[, c(1, 3)], c("cold", "hot")) 
}, simplify = FALSE)) 

"çifti" "sıcak" sütunların her biri ile "soğuk" sütunların her fikir yapmak için uzun bir veri kümesi. out şuna benzer:

xtabs(~ cold + hot, na.omit(out)) 
#   hot 
# cold  Callus flutter infection medication twitching walking 
# Bump   0  1   0   0   1  0 
# hemaloma  1  0   1   0   0  0 
# muscle  0  1   0   1   2  0 
# pain   1  0   2   2   1  1 
# sleep   0  0   1   1   0  1 
+0

, ancak orijinal veri kümemde 'Col_Cold_x' sırasına göre' Cold' anahtar sözcüğüne sahip sütunlar bulunmuyor, örneğin 'Cold' sözcüğünün farklı kalıpları var, örneğin Col_Cold gibi birkaç sütun var ve sütun adlarıyla birkaç sütun var Col_Cold_xy1 .... Col_Cold_xy10' ve Col_Cold1 ..... Col_Cold10' sütun adlarına sahip birkaç sütun ve 'Col_Cold_Combine1 ...... Col_Cold_Combine10' desenine sahip bazı sütunlar. bazı problemler.Kodu nasıl değiştirebilirim? Sağol Wong. –

+0

Bu durumda ilgili sütunları bulmak için 'grep' kullanabiliriz. Düzenlemeleri görün. –

+0

teşekkürler Wong bu hile yaptı. –

İlgili konular