R语言如何对指定值做Pivot转换得到目标数据框结构?
解决方案
你的核心需求是为每个ID匹配对应的唯一日期值,再保留其余非Date类型的行即可,有两种常用实现思路:
方法1:拆分匹配法(逻辑最直观,性能更高)
先单独提取每个ID对应的日期映射表,再和原数据中排除Date类型的行做关联,代码如下:
library(tidyverse) # 构造ID与日期的映射表 date_map <- df %>% filter(Type == "Date") %>% select(ID, Date = Parameter) # 过滤原数据的Date行后关联日期 result <- df %>% filter(Type != "Date") %>% left_join(date_map, by = "ID")
方法2:宽表中转法(适配你原本尝试的pivot逻辑)
先按ID聚合转宽表拿到所有字段,再把非Date的字段转回长格式即可:
library(tidyverse) result <- df %>% pivot_wider(names_from = Type, values_from = Parameter) %>% # 把Text、Value列转回长格式,自动丢弃空值 pivot_longer(cols = c(Text, Value), names_to = "Type", values_to = "Parameter", values_drop_na = TRUE)
基础R实现(无需加载第三方包)
如果不想依赖tidyverse,用基础函数也可以实现:
# 生成ID日期映射 date_map <- aggregate(Parameter ~ ID, df[df$Type == "Date", ], FUN = identity) colnames(date_map)[2] <- "Date" # 关联过滤后的原数据 result <- merge(df[df$Type != "Date", ], date_map, by = "ID")
以上三种方法输出的结果都和你需要的目标格式完全一致。
内容的提问来源于stack exchange,提问作者onhalu
相关产品推荐
相关产品推荐

