在R中按ptnt分组,拼接列中去除连续重复后的行值序列
解决方法
你的问题出在unique(col)会直接去除所有重复值,不管它们是不是连续出现的,所以只能得到三个唯一值的拼接结果。要实现保留元素出现顺序,仅合并连续重复项的需求,可以用rle()函数处理连续重复的序列,再拼接成目标字符串。
以下是两种可行的dplyr实现方式:
方式一:直接在分组内生成目标列
library(dplyr) df <- data.frame(col = c("aa", "bb", "cc", "aa", "aa", "bb","bb","bb"), ptnt = c("a","a","a","a","a","a","a","a")) df <- df %>% group_by(ptnt) %>% mutate(output = paste0(rle(col)$values, collapse = "-")) %>% ungroup()
rle(col)会识别col中连续重复的元素,返回的$values就是去重连续重复后的有序元素列表,用paste0(..., collapse="-")就能拼接成你需要的aa-bb-cc-aa-bb。
方式二:先汇总再合并回原数据框(适合多分组场景)
如果需要先单独生成每个分组的结果再合并,可使用summarise配合left_join:
library(dplyr) library(stringr) # 用str_c也可以,和paste0效果一致 grouped_result <- df %>% group_by(ptnt) %>% summarise(output = str_c(rle(col)$values, collapse = "-")) df <- df %>% left_join(grouped_result, by = "ptnt")
运行后df的output列就会全部显示aa-bb-cc-aa-bb,符合你的预期。
内容的提问来源于stack exchange,提问作者Statistics Tutorial
相关产品推荐
相关产品推荐

