【问题标题】:Deleting columns and rows from a matrix by name [R]按名称从矩阵中删除列和行 [R]
【发布时间】:2014-04-29 21:26:53
【问题描述】:

我有一个亲属关系矩阵,它本质上是一个向下的 ID 列表和相同的 ID,如下所示:

ID1  ID2  ID3  ID4  ID5  ID6
ID2
ID3
ID4
ID5
ID6

等等。我想从矩阵中删除某些 ID(即删除我不想要的 ID 的列和行)。我的矩阵是 129 x 129,我想要保留的 ID 列表是 60 个 ID。我尝试了以下代码(带有虚拟数据):

kinstmp <- matrix(c(0,0,1,0,1,0,
     0,0,1,0,0,0,
     0,1,1,1,0,0,
     1,0,1,0,0,0,
     0,0,1,0,1,0,
     0,0,1,0,0,0,
     0,1,1,1,0,0), nrow=6) #example of what my matrix looks like
kinstmp2 <- kinstmp[rownames(kinstmp) %in% id, ]
kins <- kinstmp2[,colnames(kinstmp2) %in% id ]

但是,这不会导致任何行和列被删除。有没有办法让它工作?

id文件的一个例子是:

ID3
ID5
ID6

【问题讨论】:

  • 并将kinstmp2[colnames(kinstmp2) %in% id,] 更改为kinstmp2[,colnames(kinstmp2) %in% id]
  • 已更正 - 但仍然没有影响

标签: r matrix


【解决方案1】:

您需要将dimnames 添加到矩阵中,并确保将列条件放在逗号的右侧(字面意思)。

nm <- paste0("ID", 1:6)
kinstmp <- matrix(c(0,0,1,0,1,0,
                    0,0,1,0,0,0,
                    0,1,1,1,0,0,
                    1,0,1,0,0,0,
                    0,0,1,0,1,0,
                    0,0,1,0,0,0), nrow = 6, dimnames = list(nm, nm))
kinstmp

id <- c("ID3", "ID5", "ID6")

# subsetting rows
kinstmp2 <- kinstmp[!rownames(kinstmp) %in% id, ]
kinstmp2
#     ID1 ID2 ID3 ID4 ID5 ID6
# ID1   0   0   0   1   0   0
# ID2   0   0   1   0   0   0
# ID4   0   0   1   0   0   0

# subsetting columns
kins <- kinstmp2[ , !colnames(kinstmp2) %in% id]
kins
#     ID1 ID2 ID4
# ID1   0   0   1
# ID2   0   0   0
# ID4   0   0   0

# or subsetting rows and columns in one call
kinstmp[!rownames(kinstmp) %in% id, !colnames(kinstmp2) %in% id]

【讨论】:

  • 实际上 - 这似乎摆脱了所有 ID(不仅仅是我不想要的那些)。也很好奇如何保留我想要的 ID。只需将代码更改为(例如)kinstmp[rownames(kinstmp) %in% id, ] 似乎不起作用...
  • 所以你应该... 我的身份证一开始就错了。 :)
猜你喜欢
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 2017-03-22
  • 2020-07-14
  • 2016-05-26
相关资源
最近更新 更多