R语言pivot_longer宽转长:指定列仅保留在通讯作者对应行
实现方案
核心问题是宽转长时文章维度的字段会默认复制到所有作者行,只要在转长后增加通讯作者匹配逻辑,仅给匹配到通讯作者的行保留专属字段即可。之前匹配失败是因为RP(通讯作者简称)带逗号、点号等标点,和AU(作者简称)的格式不一致,直接硬匹配无法命中。
完整可运行代码如下:
library(tidyverse) authors <- articles %>% # 保留你原有的宽转长逻辑,不需要改动 pivot_longer( cols = starts_with(c("AF", "AU")), names_to = c(".value", "ArtAthID"), names_sep = "_", values_drop_na = TRUE ) %>% # 按单篇文章分组匹配通讯作者 group_by(ArtID) %>% mutate( # 临时清洗RP字段:移除所有逗号、点号,统一空格格式,和AU字段格式对齐 rp_match = str_remove_all(RP, "[,\\.]") %>% str_squish(), # 仅通讯作者行保留Country值,其余行置为NA Country = if_else(AU == rp_match, Country, NA_character_) # 如有Uni、Email等其他通讯作者专属字段,按相同格式追加即可,例: # Uni = if_else(AU == rp_match, Uni, NA_character_), # Email = if_else(AU == rp_match, Email, NA_character_) ) %>% # 删除临时匹配用的字段,解除分组 select(-rp_match) %>% ungroup()
运行后输出结果和预期完全一致:
# A tibble: 10 × 6 ArtID RP Country ArtAthID AF AU <int> <chr> <chr> <chr> <chr> <chr> 1 1 DE GARRIDO, L spain 1 DE GARRIDO, LUIS DE GARRIDO L 2 2 CURSEU, PL romania 1 CURSEU, PETRU L. CURSEU PL 3 2 CURSEU, PL NA 2 SCHRUIJER, SANDRA G. L. SCHRUIJER SGL 4 2 CURSEU, PL NA 3 FODOR, OANA C. FODOR OC 5 3 HENIKE, T NA 1 STIELER, MAXIMILIAN STIELER M 6 3 HENIKE, T germany 2 HENIKE, TASSILO HENIKE T 7 4 DI VINCENZO, F italy 1 DI VINCENZO, FAUSTO DI VINCENZO F 8 4 DI VINCENZO, F NA 2 IACOPINO, VALENTINA IACOPINO V 9 5 OMIGIE, D NA 1 OMIGIE, DIANA OMIGIE D 10 5 OMIGIE, D NA 2 RICCI, JESSICA RICCI J
注意事项
- 姓名匹配逻辑对常规的缩写、标点差异兼容性较好,如果存在姓名拼写变体、特殊字符的情况,可以适当调整
rp_match的清洗规则 - 所有仅归属于通讯作者的文章层面字段,都可以在
mutate步骤中参照Country的写法追加判断,不需要调整前后的转长逻辑
内容的提问来源于stack exchange,提问作者Alex M.
相关产品推荐
相关产品推荐

