【问题标题】:Creating a list with matching row names as in matrix in R [duplicate]创建具有匹配行名称的列表,如R中的矩阵[重复]
【发布时间】:2021-01-29 22:32:12
【问题描述】:

我有一个向量,即一个包含 107 个国家名称和值的列表,以及一个包含 203 个国家名称和值的矩阵。我想调整列表以按行名称匹配矩阵,以便包含匹配的国家名称和值,而其他国家则填充 NA。

这是一个可重现的示例。如您所见,阿富汗没有包含在向量中,而是包含在矩阵中,因为矩阵包含更多国家。

#vector
df <- read.table(header=TRUE, 
text="Area Value             
Albania 2758
Angola  64772
Argentina   266403082
Australia   251000
Austria 784684
")

#matrix
Z <- matrix(1:25, nrow = 5, ncol = 5, byrow=TRUE, dimnames = list(c("Afghanistan","Albania","Algeria","Argentina","Australia"), c("Afghanistan","Albania","Algeria","Argentina","Australia")))

我该怎么做?

【问题讨论】:

    标签: r list matrix vector match


    【解决方案1】:

    您可以使用 df 从矩阵和 merge 创建行名数据框:

    result <- merge(data.frame(Area = rownames(Z)), df, all.x = TRUE, by = 'Area')
    result
    
    #         Area     Value
    #1 Afghanistan        NA
    #2     Albania      2758
    #3     Algeria        NA
    #4   Argentina 266403082
    #5   Australia    251000
    

    【讨论】:

    • 太棒了,谢谢!我可以在这段代码中以某种方式使用 as.numeric 来确保结果是数字吗?
    • 什么意思?对于您给定的示例,我将 class(result$Value) 视为整数。
    • 当试图通过 df + rowSums(Z) 一起计算列表和矩阵时,我收到错误消息“Ops.factor(left, right) : ‘+’ not meaning for factor”。所以我认为 df 或 Z 不能是数字?
    • @JohannaH 但是resultArea 列不是数字。试试这样的:replace(result$Value, is.na(result$Value), 0) + rowSums(Z, na.rm = TRUE) .
    • 完美运行,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多