С нескольких дней я ищу способ управлять своими данными в 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
Что такое 'N' в 'df'? Соответствует ли это названиям ростов «m1/m2»? – akrun
также помогло бы обеспечить воспроизводимый пример ...с фактическими данными или аналогичными данными –
Привет @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