Использование функции R, аналогичной VLOOKUP в Excel - PullRequest
0 голосов
/ 30 марта 2020

У меня большой набор данных, в котором я хотел выполнить функцию VLOOKUP в Excel. Проблема в том, что строк слишком много, и Excel не может обработать размеры. Даже подмножества слишком длинные для Excel. Вот почему я хочу использовать R для выполнения той же функции.

Что у меня есть: очень большой набор данных и короткий «Lookup-набор данных».

Большой набор данных имеет столбец (Lookup), который имеет тот же уникальный идентификатор, что и набор данных Lookup.

Пример большого набора данных (исходный набор данных имеет 14 столбцов с другими соответствующими данными, включенными в столбец Lookup, но здесь я попытался упростить его):

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

Пример таблицы поиска:

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 из набора данных lookup-data?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Нет необходимости использовать dplyr, достаточно простого base-R с функцией match.

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

Если вам нужно выполнять поиск чаще и иметь действительно большой lookuptable , может быть некоторое преимущество в использовании fastmatch -пакета с аналогичной fmatch -функцией, но только если обычный match слишком медленный.

1 голос
/ 30 марта 2020

Если вы предпочитаете использовать пакет 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

Или используйте базовый R

merge(bigDF, lookupDF)

Примечание. merge не сохраняет порядок строк

data


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)
...