【问题标题】:How can I use purrr to match records from a lookup table?如何使用 purrr 匹配查找表中的记录?
【发布时间】:2017-07-15 10:34:07
【问题描述】:

我有这个数据集

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 使用查找表将Q1Q2 中的值转换为完整的状态名称

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

匹配错误(.x,lktState$abb):找不到对象“.x”

【问题讨论】:

  • 这是一种方法,df %&gt;% gather(var, abb, -value) %&gt;% left_join(lktState) %&gt;% select(-abb) %&gt;% spread(var, name)
  • @sotos 注意这需要tidyr 包。

标签: r dplyr purrr


【解决方案1】:

基本 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

无需使用类似“应用”的惯用语来执行此基本查找表分配。

【讨论】:

    【解决方案2】:

    我同意 Sotos 的观点,即加入是执行此操作的自然方式。但是,您的purrr 解决方案绝对是可以修复的。

    你错过了三件事,

    1. 除了简单的单个函数之外,您需要在mutate_at 中使用funs
    2. map 函数对匿名函数使用 ~ 表示法。
    3. 您不想返回一个列表,而是一个字符向量,所以使用_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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多