首先,“复杂滞后继承”可能不是最清晰的标题,所以欢迎提出建议。我有一个大型有序分段字符串数据集,需要通过分段的词干匹配进行分组。此循环示例演示了所需的逻辑:
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/