如何解决R等效于Excel VLOOKUP
为了清除某些数据,我尝试使用dplyr :: mutate()函数设置与Excel VLOOKUP等效的用法:
vlookup <-
function(theString,theMapping)
{
library("magrittr")
which(
theMapping[1] == theString
)[1] %>%
theMapping[.,2]
}
对单个字符串进行测试可以正常工作:
test_mapping <-
tibble(
c("AD","Andorra"),c("AE","United Arab Emirates"),c("AF","Afghanistan")
) %>%
t %>%
as_tibble
> "AD" %>% vlookup(test_mapping)
# A tibble: 1 x 1
V2
<chr>
1 Andorra
但是,当使用mutate()将其应用到小对象上时,它不起作用:
tibble(
country = c("AE","AF","foo")
) %>%
mutate(
country_remap = country %>% vlookup(test_mapping)
)
> tibble(
+ country = c("AE","foo")
+ ) %>%
+ mutate(
+ country_remap = country %>% vlookup(test_mapping)
+ )
# A tibble: 3 x 2
country country_remap$V2
<chr> <chr>
1 AE NA
2 AF NA
3 foo NA
有什么办法解决这个问题吗?
解决方法
您的vlookup
函数未向量化,这意味着它一次只能处理一个值。如果您在管道中添加rowwise
,它将按预期工作。
library(dplyr)
library(tibble)
tibble(country = c("AE","AF","foo")) %>%
rowwise() %>%
mutate(country_remap = country %>% vlookup(test_mapping))
# country country_remap$V2
# <chr> <chr>
#1 AE United Arab Emirates
#2 AF Afghanistan
#3 foo NA
但是,这效率不高。您应该改为在R中加入数据框。
tibble(country = c("AE","foo")) %>%
left_join(test_mapping,by = c('country' = 'V1'))
,
我们可以使用deframe
创建命名向量并更有效地重新映射
library(dplyr)
library(tibble)
tibble(
country = c("AE","foo")
) %>% mutate(country_remap = deframe(test_mapping)[country])
# A tibble: 3 x 2
# country country_remap
# <chr> <chr>
#1 AE United Arab Emirates
#2 AF Afghanistan
#3 foo <NA>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。