r - 使用 dplyr 进行复杂滞后继承

标签 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 ,但如果我错了,我很想知道怎么做。

最佳答案

尽管内部 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."

关于r - 使用 dplyr 进行复杂滞后继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51938926/

相关文章:

r - 在 R 中拆分数字

r - 如何按第二个数据框中列出的任意标识符进行过滤?

r - geosphere distHaversine() & dplyr - 向量的错误长度错误,应该是 2

json - 使用 mongolite R 包将 json 对象插入 MongoDB

r - 找出一列的 "max"和对应行的另一列的值

r - 在数据框中查找重复项并返回每个重复记录的计数

r - 根据列表值过滤数据框列

R dplyr : group by without aggregate function

r - 从 R 中给定条件后的列 'n' 个字符中删除字符

r - 有条件地将数据框中的值更改为其列名