R语言按星号分组规则重构tibble数据框的实现方法咨询
你可以直接用tidyverse套件实现,完整代码如下:
library(tidyverse) # 构造原始数据 df1 <- tibble(a = c("123*", "123", "124", "678*", "678", "679", "677")) result <- df1 %>% # 生成分组ID:遇到带*的行就新建一个分组 mutate(group_id = cumsum(str_detect(a, "\\*$"))) %>% group_by(group_id) %>% # 提取当前分组的a列值(带*行去星后的结果) mutate(a_new = str_remove(first(a), "\\*$")) %>% # 过滤掉分组内的标识行,以及和a_new相等的冗余行 filter(!str_detect(a, "\\*$"), a != a_new) %>% # 重命名列,保留需要的字段 ungroup() %>% select(a = a_new, b = a)
运行后得到的result就是你需要的结构:
# A tibble: 3 × 2 a b <chr> <chr> 1 123 124 2 678 679 3 678 677
逻辑说明
- 用
cumsum结合星号检测生成组ID,保证每个带星号的标识和后续直到下一个标识的所有行都归为同一组 - 每个组内取第一行(即带星号的标识行)去星后作为新的a列值
- 过滤掉组内的标识行,以及和新a列值完全相同的冗余行,剩余的原值就是b列的取值
- 分组逻辑天然绑定了a和b的对应关系,自动处理了一个标识对应多个b值时a重复的需求
内容的提问来源于stack exchange,提问作者user13267770
相关产品推荐
相关产品推荐

