在 Excel 中使用类似于 VLOOKUP 的 R 函数

Using R function similar to VLOOKUP in Excel

我有一个大型数据集,我想在 Excel 中对其执行 VLOOKUP 函数。问题是行太多,Excel 无法处理维度。对于 Excel,即使是子集也太长了。 这就是为什么我想使用 R 来执行相同的功能。

我有什么:一个非常大的数据集和一个简短的 'Lookup-dataset.'

大型数据集有一列 (Lookup) 具有与在 Lookup-dataset 中找到的相同的唯一标识符。

大数据集示例(原始数据集有 14 列,其他相关数据已合并到查找列中,但这里我尽量简化):

Species    Site   Present    Lookup
A           A1    1          Aa1 
A           A2    0          Ab2
A           A3    1          Aa3
A           A4    1          Aa4
A           A4.2  1          Aa4
B           B1    0          Bb1
B           B2    0          Bb2
B           B3    0          Bb3
B           B4    1          Bb4
B           B1.1  1          Bb1
B           B2.1  0          Bb2

查找示例 table:

Lookup  Val
Aa1     12 
Ab2     15
Aa3     18
Aa4     101
Bb1     60
Bb2     75
Bb3     89
Bb4     3

由于与查找数据集相比,数据集中的列更多,我无法使用 dplyr::full_join 函数来完成这项工作。

在 Excel 中,我会使用 VLOOKUP 函数并向下填充,以便新列中的所有单元格都具有正确的值。

我的问题:如何在 R 中实现我的数据集有一个新列,其中包含查找数据集中的 Val?

如果您更喜欢使用 dplyr 包,请使用 left_join 函数:

library(dplyr)
bigDF %>% left_join(lookupDF)

# Joining, by = "Lookup"
# A tibble: 11 x 5
#    Species Site  Present Lookup   Val
#    <chr>   <chr>   <dbl> <chr>  <dbl>
#  1 A       A1          1 Aa1       12
#  2 A       A2          0 Ab2       15
#  3 A       A3          1 Aa3       18
#  4 A       A4          1 Aa4      101
#  5 A       A4.2        1 Aa4      101
#  6 B       B1          0 Bb1       60
#  7 B       B2          0 Bb2       75
#  8 B       B3          0 Bb3       89
#  9 B       B4          1 Bb4        3
# 10 B       B1.1        1 Bb1       60
# 11 B       B2.1        0 Bb2       75

或使用base R

merge(bigDF, lookupDF)

注意。 merge 不保持行序

数据


bigDF <- tribble(
            ~Species,    ~Site,   ~Present,    ~Lookup,
            "A",    "A1",   1,  "Aa1",
            "A",    "A2",   0,  "Ab2",
            "A",    "A3",   1,  "Aa3",
            "A",    "A4",   1,  "Aa4",
            "A",    "A4.2", 1,  "Aa4",
            "B",    "B1",   0,  "Bb1",
            "B",    "B2",   0,  "Bb2",
            "B",    "B3",   0,  "Bb3",
            "B",    "B4",   1,  "Bb4",
            "B",    "B1.1", 1,  "Bb1",
            "B",    "B2.1", 0,  "Bb2")


lookupDF <- tribble(
            ~Lookup,  ~Val,
            "Aa1",      12, 
            "Ab2",      15,
            "Aa3",      18,
            "Aa4",      101,
            "Bb1",      60,
            "Bb2",      75,
            "Bb3",      89,
            "Bb4",      3)

不需要用dplyr,简单的base-R就够了,有match-function.

largedataset$Val <- lookuptable$Val[match(largedataset$Lookup, lookuptable$Lookup)]

如果您需要更频繁地进行查找并且有一个非常大的查找表,使用具有类似 fmatch 功能的 fastmatch 包可能会有一些好处,但前提是常规 match 太慢了。