【问题标题】:How can I create a vector of row numbers from a matrix in R (order of acquisition)?如何从 R 中的矩阵(获取顺序)创建行号向量?
【发布时间】:2019-12-08 18:07:04
【问题描述】:

我有两个文件。第一个文件是一个数据框,在一列中仅包含时间,而在一秒中包含个人

#      [Time]      [Individual]
# [1]    1528142     C5A1790 
# [2]    1528142     C5A1059 
# [3]    1528142     C5A1084 
# [4]    1528142     C5A1564
# [5]    1528142     C5A1239
# [6]    1528142     C5A1180 

第二个是 N X N 矩阵,其中行和列都是个体,包括第一个矩阵中的个体。

#            [C5A1084] [C5A1059] [C5A1790] [C5A1180] 
# 1 [C5A1084]    0        0.5        1         0
# 2 [C5A1059]   0.5        0         0         1
# 3 [C5A1790]    1         1         0        0.5
# 4 [C5A1180]    0         1        0.5        0

我需要创建一个向量,其中包含矩阵中的行号,我可以在该矩阵中从数据框中找到个人,并按照它们在数据框中列出的顺序。对于这些示例数据,它将是 (3,2,1,4)。

我尝试将which() 函数用作

RingIndex <- which(Matrix$IDcolumn == FrameIDs)

并收到“较长的对象长度不是较短对象长度的倍数”消息,大概是因为矩阵包含的个体比数据框多。 %in%match() 也返回错误,指出替换的行数少于数据。

按照cmets中的建议,我尝试了

RingIndex <- which(Matrix$IDcolumn %in% FrameIDs)

其中成功返回了正确的行号,但按升序而不是原始数据的顺序。 match() 函数继续抱怨不同的替换和原始长度。

我可以使用什么方法来获取我的向量?

非常感谢!

【问题讨论】:

  • 您能否提供一个可重现的两个矩阵示例?见此链接:stackoverflow.com/questions/5963269/…
  • 那些是矩阵还是data.frames?区别是class(data) 返回什么? (data 是这两个对象中的每一个。)
  • 我不确定您是否需要 for 循环。 which() 应该返回满足某些逻辑语句的所有行。
  • @dc37 我已尝试提供我的数据示例。
  • @GKi 是的,我想终于解决了。

标签: r matrix vector


【解决方案1】:
df <- data.frame(Time = runif(6,1528142,1528150), 
                 Individuals = c("C5A1790","C5A1791","C5A1792","C5A1793","C5A1794","C5A1795"))
> df
     Time Individuals
1 1528144     C5A1790
2 1528143     C5A1791
3 1528144     C5A1792
4 1528148     C5A1793
5 1528145     C5A1794
6 1528143     C5A1795

nnMatrix <- matrix(runif(36,0,1),6,6)
colnames(nnMatrix) <- df$Individuals
rownames(nnMatrix) <- df$Individuals
> nnMatrix
           C5A1790   C5A1791   C5A1792    C5A1793   C5A1794    C5A1795
C5A1790 0.08096946 0.8716328 0.6895134 0.05692825 0.4555460 0.53224424
C5A1791 0.42568532 0.5920239 0.4523232 0.11516185 0.8053652 0.72299411
C5A1792 0.42439187 0.6101881 0.8534429 0.86010851 0.1269521 0.41066857
C5A1793 0.26043345 0.8011337 0.8032234 0.30930988 0.2298927 0.93320166
C5A1794 0.43065533 0.2161525 0.6702832 0.89304071 0.6765714 0.09769635
C5A1795 0.70594252 0.1048099 0.7478553 0.87839534 0.5173364 0.69957502


> sapply(df$Individuals, function(t) which(colnames(nnMatrix) == t))
[1] 1 2 3 4 5 6

如果你改变顺序

colnames(nnMatrix) <- rev(colnames(nnMatrix))

[1] 6 5 4 3 2 1

您可能想要检查重复值和缺失值,但主要方法是相同的。

按照 cmets (@GKi) 中的建议,match 也可以使用

> match(df$Individuals,colnames(nnMatrix))
[1] NA  1  3  4  5  6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多