如何使用 purrr 来匹配查找 table 中的记录?
How can I use purrr to match records from a lookup table?
我有这个数据集
library(dplyr)
data_frame(Q1= c('AL', NA, 'TX', 'FL'), Q2=c('MN', 'CO', NA, NA), value=c(10,24,12,54))
# A tibble: 4 x 3
Q1 Q2 value
<chr> <chr> <dbl>
1 AL MN 10
2 <NA> CO 24
3 TX <NA> 12
4 FL <NA> 54
我正在尝试使用 purrr
通过查找 table
将 Q1
和 Q2
中的值转换为完整的州名称
lktState <- data_frame(abb=state.abb, name=state.name)
到目前为止我已经试过了,但它不起作用
data_frame(Q1= c('AL', NA, 'TX', 'FL'), Q2=c('MN', 'CO', NA, NA), value=c(10,24,12,54)) %>%
mutate_at(vars('Q1','Q2'), purrr::map(.x = ., lktState$name[match(.x, lktState$abb)]))
Error in match(.x, lktState$abb) : object '.x' not found
我同意 Sotos 的观点,即联接是执行此操作的自然方式。但是,您的 purrr
解决方案绝对是可以解决的。
你错过了三件事,
- 除简单的单一功能外,您需要在
mutate_at
中使用funs
。
map
函数对匿名函数使用 ~
表示法。
- 您不想 return 一个列表,而是一个字符向量,所以使用
_chr
变体。
.
mutate_at(df,
vars('Q1', 'Q2'),
funs(purrr::map_chr(.x = ., ~lktState$name[match(.x, lktState$abb)])))
给出:
# A tibble: 4 x 3
Q1 Q2 value
<chr> <chr> <dbl>
1 Alabama Minnesota 10
2 <NA> Colorado 24
3 Texas <NA> 12
4 Florida <NA> 54
数据
df <- data_frame(Q1= c('AL', NA, 'TX', 'FL'), Q2=c('MN', 'CO', NA, NA), value=c(10,24,12,54))
基础 R 版本(可以矢量化,但这说明了概念):
xdf <- data.frame(
Q1= c('AL', NA, 'TX', 'FL'),
Q2 = c('MN', 'CO', NA, NA),
value = c(10, 24, 12, 54),
stringsAsFactors=FALSE
) -> xdf
xdf
## Q1 Q2 value
## 1 AL MN 10
## 2 <NA> CO 24
## 3 TX <NA> 12
## 4 FL <NA> 54
lktState <- setNames(state.name, state.abb)
xdf$Q1 <- lktState[xdf$Q1]
xdf$Q2 <- lktState[xdf$Q2]
xdf
## Q1 Q2 value
## 1 Alabama Minnesota 10
## 2 <NA> Colorado 24
## 3 Texas <NA> 12
## 4 Florida <NA> 54
"tidyverse"
library(dplyr)
xdf <- data_frame(
Q1= c('AL', NA, 'TX', 'FL'),
Q2 = c('MN', 'CO', NA, NA),
value = c(10, 24, 12, 54)
) -> xdf
xdf
## # A tibble: 4 x 3
## Q1 Q2 value
## <chr> <chr> <dbl>
## 1 AL MN 10
## 2 <NA> CO 24
## 3 TX <NA> 12
## 4 FL <NA> 54
lktState <- setNames(state.name, state.abb)
mutate_at(xdf, .vars=vars(-value), .funs=funs(lktState[.]))
## # A tibble: 4 x 3
## Q1 Q2 value
## <chr> <chr> <dbl>
## 1 Alabama Minnesota 10
## 2 <NA> Colorado 24
## 3 Texas <NA> 12
## 4 Florida <NA> 54
无需使用类似 "apply" 的习语来执行此基本查找 table 作业。
我有这个数据集
library(dplyr)
data_frame(Q1= c('AL', NA, 'TX', 'FL'), Q2=c('MN', 'CO', NA, NA), value=c(10,24,12,54))
# A tibble: 4 x 3
Q1 Q2 value
<chr> <chr> <dbl>
1 AL MN 10
2 <NA> CO 24
3 TX <NA> 12
4 FL <NA> 54
我正在尝试使用 purrr
通过查找 table
Q1
和 Q2
中的值转换为完整的州名称
lktState <- data_frame(abb=state.abb, name=state.name)
到目前为止我已经试过了,但它不起作用
data_frame(Q1= c('AL', NA, 'TX', 'FL'), Q2=c('MN', 'CO', NA, NA), value=c(10,24,12,54)) %>%
mutate_at(vars('Q1','Q2'), purrr::map(.x = ., lktState$name[match(.x, lktState$abb)]))
Error in match(.x, lktState$abb) : object '.x' not found
我同意 Sotos 的观点,即联接是执行此操作的自然方式。但是,您的 purrr
解决方案绝对是可以解决的。
你错过了三件事,
- 除简单的单一功能外,您需要在
mutate_at
中使用funs
。 map
函数对匿名函数使用~
表示法。- 您不想 return 一个列表,而是一个字符向量,所以使用
_chr
变体。
.
mutate_at(df,
vars('Q1', 'Q2'),
funs(purrr::map_chr(.x = ., ~lktState$name[match(.x, lktState$abb)])))
给出:
# A tibble: 4 x 3 Q1 Q2 value <chr> <chr> <dbl> 1 Alabama Minnesota 10 2 <NA> Colorado 24 3 Texas <NA> 12 4 Florida <NA> 54
数据
df <- data_frame(Q1= c('AL', NA, 'TX', 'FL'), Q2=c('MN', 'CO', NA, NA), value=c(10,24,12,54))
基础 R 版本(可以矢量化,但这说明了概念):
xdf <- data.frame(
Q1= c('AL', NA, 'TX', 'FL'),
Q2 = c('MN', 'CO', NA, NA),
value = c(10, 24, 12, 54),
stringsAsFactors=FALSE
) -> xdf
xdf
## Q1 Q2 value
## 1 AL MN 10
## 2 <NA> CO 24
## 3 TX <NA> 12
## 4 FL <NA> 54
lktState <- setNames(state.name, state.abb)
xdf$Q1 <- lktState[xdf$Q1]
xdf$Q2 <- lktState[xdf$Q2]
xdf
## Q1 Q2 value
## 1 Alabama Minnesota 10
## 2 <NA> Colorado 24
## 3 Texas <NA> 12
## 4 Florida <NA> 54
"tidyverse"
library(dplyr)
xdf <- data_frame(
Q1= c('AL', NA, 'TX', 'FL'),
Q2 = c('MN', 'CO', NA, NA),
value = c(10, 24, 12, 54)
) -> xdf
xdf
## # A tibble: 4 x 3
## Q1 Q2 value
## <chr> <chr> <dbl>
## 1 AL MN 10
## 2 <NA> CO 24
## 3 TX <NA> 12
## 4 FL <NA> 54
lktState <- setNames(state.name, state.abb)
mutate_at(xdf, .vars=vars(-value), .funs=funs(lktState[.]))
## # A tibble: 4 x 3
## Q1 Q2 value
## <chr> <chr> <dbl>
## 1 Alabama Minnesota 10
## 2 <NA> Colorado 24
## 3 Texas <NA> 12
## 4 Florida <NA> 54
无需使用类似 "apply" 的习语来执行此基本查找 table 作业。