自从几天以后,我正在寻找在R中管理我的数据的方式。我拥有相同的一组个人(n = 5013 )结构如下:两个不对称的邻接矩阵(m1
和m2
)(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
'df'中的'N'是什么?它是否对应'm1/m2'的rownames? – akrun
也有助于提供一个可重复的例子...与实际数据或类似数据 –
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