首先,“复杂滞后继承”可能不是最清晰的标题,因此欢迎提出建议。我有一个很大的有序分段字符串数据集,我需要按各部分的词干匹配进行分组。此循环示例演示了所需的逻辑:
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
,但是如果我错了,我很想知道怎么做。
答案 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."