2016-08-18 61 views
0

自從幾天以後,我正在尋找在R中管理我的數據的方式。我擁有相同的一組個人(n = 5013 )結構如下:兩個不對稱的鄰接矩陣(m1m2)(n×n方陣,其中所有個體構成矩陣的行和列)和數據框(df)與我的個人集合(df$N)和一個變量(df$V) 。R - 將數據框中的變量與其他矩陣的值相關聯的矩陣的子集

我搜索中的m2的單元值的函數使用可變df$V(不同的標準/變量值的行和cols)到子集的矩陣和子集m1(或識別無效的病例)的方式。

下面的例子說明我的問題:

# N are individuals. Two matrices (m1 and m2) and a dataframe (df) with a variable (df$V) 
> df 
    N V 
1 a v1 
2 b v2 
3 c v3 
4 d v1 
5 e v2 
6 f v3 
7 g v1 

> m1 
    a b c d e f g 
a 7 3 9 8 1 6 8 
b 1 6 9 2 9 4 4 
c 2 3 2 7 9 7 3 
d 9 7 6 3 2 6 6 
e 9 9 6 5 5 6 5 
f 1 1 1 6 1 5 9 
g 6 2 5 2 1 8 5 

> m2 
    a b c d e f g 
a 8 3 7 8 4 3 2 
b 2 8 4 2 7 7 2 
c 8 3 1 6 9 9 4 
d 7 3 6 7 4 9 5 
e 5 8 7 1 7 6 6 
f 9 6 8 9 6 6 2 
g 4 8 8 1 9 7 3 

例如,我子集在行取值爲「V1」和「V3」和cols取值「V2」的DF $基質細胞V

> m1subseted 
    b e 
a 3 1 
c 3 9 
d 7 2 
f 1 1 
g 2 1 
> m2subseted 
    b e 
a 3 4 
c 3 9 
d 3 4 
f 6 6 
g 8 9 

,然後在M1-子集的子集的意見(或識別無效的病例),其具有以m 2-的子集的單元格值「< 5」。我正在搜索的結果:矩陣,m1的子集。

#subset m1 if cell value in m2 is <5/Invalid cells = NA 
    b e 
a 3 1 
c 3 NA 
d 7 2 
f NA NA 
g NA NA 

通過@jkt正常工作提出了重現數據

m1 <- as.matrix(data.frame(a = sample(1:10, size = 7), 
       b= sample(1:10, size = 7), 
       c=sample(1:10, size = 7), 
       d=sample(1:10, size = 7), 
       e=sample(1:10, size = 7), 
       f=sample(1:10, size = 7), 
       g=sample(1:10, size = 7))) 
       rownames(m1)<-colnames(m1) 


m2 <- as.matrix(data.frame(a = sample(1:10, size = 7), 
       b= sample(1:10, size = 7), 
       c=sample(1:10, size = 7), 
       d=sample(1:10, size = 7), 
       e=sample(1:10, size = 7), 
       f=sample(1:10, size = 7), 
       g=sample(1:10, size = 7))) 
       rownames(m2)<-colnames(m2) 



df <- data.frame(N = as.factor(letters[1:7]), 
     V = c("v1","v2","v3","v1","v2","v3","v1")) 

評論

的解決方案,除非標籤是複雜的(帶重音符號,括號等),在我原來的數據集。我找到的解決方案是在應用算法之前,通過最簡單的標籤更改複雜標籤,並在結果上恢復原始標籤。 我與@jkt提供的解決方案(適用於本示例)共享我使用的代碼,希望對某人有用。

#Create new labels. In this case are numbers, where 7 
#correspond to the dimmensions of matrices and observations on df 
new.code.labels<-c(1:7) 
#Create new col/variable on df 
df$TempLabel<-new.code.labels 
#Recode rows and cols on matrices 
rownames(m1)<-new.code.labels 
colnames(m1)<-new.code.labels 
rownames(m2)<-new.code.labels 
colnames(m2)<-new.code.labels 

#Apply algorithm proposed by @jkt 
crit1 <- c('v1','v3') 
crit2 <- 'v2' 
#Observe I use new labels on dataframe (df$TempLabel) 
m11 <- m1[df$TempLabel[which(df$V %in% crit1)], df$TempLabel[which(df$V %in% crit2)]] 
m21 <- m2[df$TempLabel[which(df$V %in% crit1)], df$TempLabel[which(df$V %in% crit2)]] 
m11[!(m21<5)] <- NA 
m11 

#To regain the original labels on results 
row.coded.labels.result<-rownames(m11) 
df.subseted.by.result.row<-subset(df, df$TempLabel %in% row.coded.labels.result) 
rownames(m11)<-df.subseted.by.result.row$N 

col.coded.labels.result<-colnames(m11) 
df.subseted.by.result.col<-subset(df, df$TempLabel %in% col.coded.labels.result) 
colnames(m11)<-df.subseted.by.result.col$N 
m11 
+0

'df'中的'N'是什麼?它是否對應'm1/m2'的rownames? – akrun

+0

也有助於提供一個可重複的例子...與實際數據或類似數據 –

+0

Hi @akrun。 N是標籤,它們對應於m1/m2的rownames和colnames。Hi @CyrusMohammadian。這是我用來創建示例的代碼 'N < - c(「a」,「b」,「c」,「d」,「e」,「f」,「g」)#我的人口 V <-c(「v1」,「v2」,「v3」,「v1」,「v2」,「v3」,「v1」)#變量 m1 < - matrix(sample.int(9,size = 7 * 7,替換= TRUE),nrow = 7,ncol = 7 m2 < - matrix(sample.int(9,size = 7 * 7,replace = TRUE),nrow = 7,ncol = 7)colnames m1)< - N rownames(m1)< - N colnames(m2)< - N rownames(m2)< - N df <-data.frame(N,V)' 感謝您的關注! – DeLuc

回答

0

我只是使用一系列的子集命令。

這定義了兩個標準(基於V1,V3和V2):

crit1 <- c('v1','v3') 
crit2 <- 'v2' 

此子集基於所述標準和相應的行/列名的矩陣:

m11 <- m1[df$N[which(df$V %in% crit1)], df$N[which(df$V %in% crit2)]] 
m21 <- m2[df$N[which(df$V %in% crit1)], df$N[which(df$V %in% crit2)]] 

這設置所有那些在第二子集矩陣內不符合最後一個標準的值NA

m11[!(m21<5)] <- NA 

調用m11然後給你:

b e 
a 3 1 
c 3 NA 
d 7 2 
f NA NA 
g NA NA 

你可以用你的標準作爲參數加上矩陣和數據框變成一個功能。

+1

它很好用!非常感謝您的幫助! 只是一個評論:我的數據集中的標籤更加複雜(帶有重音符號,括號,逗號等等),並且此解決方案會在結果中生成錯誤。顯然,解決這個問題的方法是用原始數據集上的簡單標籤(如數字)替換複雜標籤,並在操作之後(結果中)用原始標籤替換簡單標籤。 我在我的答案中共享我使用的代碼(適用於我們的示例)(評論太長)。我希望對某人有用。 – DeLuc