R - подмножество матрицы в функции переменной из фрейма данных и значений другой матрицы

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

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

person DeLuc    schedule 18.08.2016    source источник
comment
Что такое N в 'df'? Соответствует ли это именам строк «m1/m2»?   -  person akrun    schedule 18.08.2016
comment
также было бы полезно предоставить воспроизводимый пример... с фактическими данными или аналогичными данными   -  person Cyrus Mohammadian    schedule 18.08.2016
comment
Привет @akrun. N — это метки, и они соответствуют именам строк и столбцов m1/m2 Привет, @CyrusMohammadian. Это код, который я использовал для создания примера N <- c("a", "b", "c", "d", "e", "f", "g") # My population V <-c("v1","v2","v3","v1", "v2", "v3", "v1") #The variable 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 df<-data.frame(N,V) Спасибо за интерес!   -  person DeLuc    schedule 18.08.2016


Ответы (1)


Я бы просто использовал серию подмножеств команд.

Это определяет два критерия (на основе 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

Вы можете превратить это в функцию со всеми вашими критериями в качестве аргументов, а также матрицами и фреймом данных.

person jkt    schedule 18.08.2016
comment
Он прекрасно работает! Большое спасибо за Вашу помощь! Просто комментарий: метки в моем наборе данных более сложные (со знаками ударения, круглыми скобками, запятыми и т. д.), и это решение приводит к ошибкам в результате. Очевидно, что решение этой проблемы состоит в том, чтобы заменить сложные метки простыми метками (типа чисел) на исходном наборе данных, а после операций (в результате) заменить простые метки исходными метками. Я делюсь кодом, который я использовал (адаптированный к нашему примеру) в своем ответе (слишком длинный для комментария). Я надеюсь, что это может быть полезно для кого-то. - person DeLuc; 19.08.2016