【问题标题】:Index match or vlookup to use values of one table into the corresponding row of another table [duplicate]索引匹配或 vlookup 将一个表的值用于另一表的相应行[重复]
【发布时间】:2016-02-17 21:35:36
【问题描述】:

我确信有一个相当直接的解决方案可以解决我的问题。然而,我有限的 R 技能让我失望了,我还没有找到合适的解决方案。

我有一个矩阵 A,如下所示:

year    Avg_temp
1990    14.3
1991    14.6
1992    14.5
1993    14.4
1994    14.9
1995    15.1
1996    15.2

还有一个矩阵 B,如下所示:

year    Tot_hoursofsun
1992    950
1993    960
1994    945

我想做一个 VLOOKUP(或索引匹配);目标是添加一个包含太阳小时数的列,以防矩阵 B 中存在该值,以防矩阵 A 的年份出现此值。请参阅下面的所需输出:

year    Avg_temp    Tot_hoursofsun
1990    14.3    Not available
1991    14.6    Not available
1992    14.5    950
1993    14.4    960
1994    14.9    945
1995    15.1    Not available
1996    15.2    Not available

提前非常感谢!

【问题讨论】:

  • 下面的答案忽略了喊:使用data.frame,而不是矩阵。您可能已经这样做了,但以防万一。

标签: r matrix indexing match vlookup


【解决方案1】:

您可以使用 qdapTools 包中的 lookup() 函数来等效于 VLOOKUP。

假设您的矩阵(或数据框)称为 A 和 B:

library(qdapTools)
A$Tot_hoursofsun <- lookup(A$year,B)

这不会将文本“不可用”输入到您的数据框中,而是用 NA 填充没有对应值的单元格,这是 R 用于缺失数据的符号。

【讨论】:

    【解决方案2】:

    您可以进行合并:

    m<-merge(A,B,all=TRUE)
    m[is.na(m)]<-"Not available"
    
     m
      year Avg_temp Tot_hoursofsun
    1 1990     14.3  Not available
    2 1991     14.6  Not available
    3 1992     14.5            950
    4 1993     14.4            960
    5 1994     14.9            945
    6 1995     15.1  Not available
    7 1996     15.2  Not available
    

    数据:

    A<-structure(list(year = 1990:1996, Avg_temp = c(14.3, 14.6, 14.5, 
    14.4, 14.9, 15.1, 15.2)), .Names = c("year", "Avg_temp"), class = "data.frame", row.names = c(NA, 
    -7L))
    
    B<-structure(list(year = 1992:1994, Tot_hoursofsun = c(950L, 960L, 
    945L)), .Names = c("year", "Tot_hoursofsun"), class = "data.frame", row.names = c(NA, 
    -3L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      相关资源
      最近更新 更多