dplyr的复杂滞后继承

时间:2018-08-20 21:48:15

标签: r dplyr

首先,“复杂滞后继承”可能不是最清晰的标题,因此欢迎提出建议。我有一个很大的有序分段字符串数据集,我需要按各部分的词干匹配进行分组。此循环示例演示了所需的逻辑:

require(tidyverse)

x = data_frame(name = c('smith', 'smith.james', 'smith.jill', 
                        'taylor', 'taylor.ian', 'walker', 'walker.john', 'walker.john.sid',
                        'reed.snow', 'reed.snow.harry', 'reed.snow.helen.jane'), 
               family_name = NA_character_)

x$family_name[1] = x$name[1]

for(i in 2:nrow(x)){
  # if current record matches previous record's family assignment..
  family_match = str_detect(string = x$name[i], pattern = paste0('^', x$family_name[i-1], '[.]'))
  x$family_name[i] = ifelse(family_match, x$family_name[i-1], x$name[i])
}

print(x)
#> # A tibble: 11 x 2
#>    name                 family_name
#>    <chr>                <chr>      
#>  1 smith                smith      
#>  2 smith.james          smith      
#>  3 smith.jill           smith      
#>  4 taylor               taylor     
#>  5 taylor.ian           taylor     
#>  6 walker               walker     
#>  7 walker.john          walker     
#>  8 walker.john.sid      walker     
#>  9 reed.snow            reed.snow  
#> 10 reed.snow.harry      reed.snow  
#> 11 reed.snow.helen.jane reed.snow

我已经尝试过使用这种循环方法,考虑到数据大小,这似乎不可行,因此替代方法是向量化dplyr方法或python。

问题的核心在于,每个family_name分配都是基于当前记录的name(推断新的姓氏)或先前记录的family_name的匹配。我没有看到如何使用例如pmap_chr,但是如果我错了,我很想知道怎么做。

1 个答案:

答案 0 :(得分:4)

尽管内部Reduce将使用循环,但它不使用正则表达式或显式循环。不使用任何软件包。

Names <- paste0(x$name, ".")
iter <- function(x, y) if (startsWith(y, x)) x else y
Reduce(iter, Names, acc = TRUE)

给予:

 [1] "smith."     "smith."     "smith."     "taylor."    "taylor."   
 [6] "walker."    "walker."    "walker."    "reed.snow." "reed.snow."
[11] "reed.snow."