R - 根据数据帧和其他矩阵的值来设置变量函数的矩阵

时间:2016-08-18 09:59:33

标签: r matrix dataframe subset adjacency-matrix

几天后,我正在寻找管理R中数据的方法。我有相同的一组个体(n = 5013)结构如下:两个非对称邻接矩阵(p = subprocess.Popen(cmd, stdout = subprocess.PIPE) 和{{1 }}(nxn平方矩阵,其中所有个体组成矩阵的行和列)和数据框(m1)与我的一组个体(m2)和一个变量(df )。

我正在寻找使用变量df$N(行和列的不同标准/变量值)和子集df$V(或识别无效情况)来对矩阵进行子集的方法。值df$V

以下示例说明了我的问题:

m1

例如,我将矩阵中的单元格进行子集,其中行取值“v1”和“v3”,cols取值为“v2”df $ V

m2

然后在m1子集的子集中观察(或识别无效情况),其具有m2-subseted中的单元值“<5”。我正在搜索的结果:矩阵,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

可重复数据

> 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

注释

@jkt提出的解决方案工作正常,除非标签很复杂(带重音符号,圆括号等),就像在我的原始数据集中一样。我找到的解决方案是在应用算法之前用最简单的标签更改复杂标签,并在结果上恢复原始标签。 我与@jkt提供的解决方案(适用于示例)共享我使用的代码,希望它对某人有用。

#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

1 个答案:

答案 0 :(得分: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

您可以将此转换为一个函数,其中包含所有条件作为参数以及矩阵和数据框。