2016-08-18 4 views
0

С нескольких дней я ищу способ управлять своими данными в R. У меня одинаковый набор лиц (n = 5013)), структурированные следующим образом: две асимметричные матрицы смежности (m1 и m2) (nxn квадратных матриц, где все индивидуумы составляют строки и столбцы матриц) и кадр данных (df) с моим набором лиц (df$N) и одной переменной (df$V) ,R - Подмножество матрицы в функции переменной из фрейма данных и значений другой матрицы

Я ищу способ подмножества матриц с использованием переменных df$V (значений различных критериев/переменных для строк и перевалов) и подмножество m1 (или выявлений недопустимых случаев) в зависимости от значений ячеек m2.

Следующий пример иллюстрирует мою проблему:

# 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» и перевалы принимают значения «v2» в ф.р. $ в

> 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-subseted подмножества наблюдения (или идентифицировать недействительные случаи), что имеет значение ячейки «< 5» в м2-subseted. Результат, который я ищу: матрица, подмножество 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 

воспроизводимые данные

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 работает отлично, за исключением того, когда этикетки являются сложными (с диакритическими знаками, скобки и т.д.), как в моем оригинале набор данных. Решение, которое я нахожу, заключается в изменении сложных меток простейшими, прежде чем применять алгоритмы и восстановить исходные метки результата. Я разделяю код, который я использовал с решением, предоставленным @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

Что такое 'N' в 'df'? Соответствует ли это названиям ростов «m1/m2»? – akrun

+0

также помогло бы обеспечить воспроизводимый пример ...с фактическими данными или аналогичными данными –

+0

Привет @akrun. N - это метки и соответствуют именам ростов и именам м1/м2 Привет @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, replace = 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 ДФ <-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 

Вы могли бы превратить это в функции со всеми вашими критериями в качестве аргументов плюс матриц и dataframe.

+1

Он работает красиво! Большое спасибо за Вашу помощь! Просто комментарий: ярлыки в моем наборе данных более сложны (с метками акцента, круглыми скобками, запятыми и т. Д.), И это решение генерирует ошибки в результате. Очевидно, что решение этой проблемы заключается в замене сложных ярлыков на простые метки (например, числа) на исходном наборе данных, а после операций (в результате) замените простые метки на исходные метки. Я разделяю код, который я использовал (адаптированный к нашему примеру) в своем ответе (слишком длинный для комментария). Надеюсь, это может быть полезно кому-то. – DeLuc