在 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
太慢了。
我有一个大型数据集,我想在 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
太慢了。