You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并R语言DataFrame中相同id和shift分组的不同measurement行

解决R语言DataFrame按id和shift合并measurement列的问题

你需要的是把长格式(long format)的DataFrame转换成宽格式(wide format),核心是将相同id和shift分组下的不同measurement作为列名,对应的critical_value作为列值。下面是两种常用的实现方法:

方法1:使用tidyverse的tidyr::pivot_wider

这是tidyverse生态下最直观的长转宽工具,代码可读性强,适合日常数据处理场景:

先确认你的原始数据:

df <- data.frame(id = c("1","1","1","1","2","2","4","4"), 
                 shift = c("1","1","1","2","1","2","1","1"), 
                 measurement = c("A","B","C","D","A","B","A","C"), 
                 critical_value = c("130","yes","55","1","115","no","110","54"))

加载tidyverse包并执行转换:

library(tidyverse)

wide_df <- df %>%
  pivot_wider(
    id_cols = c(id, shift),  # 作为分组依据的列
    names_from = measurement,  # 要转成列名的字段
    values_from = critical_value  # 对应列名的取值
  )

转换后的结果:

# A tibble: 5 × 6
  id    shift A     B     C     D    
  <chr> <chr> <chr> <chr> <chr> <chr>
1 1     1     130   yes   55    NA   
2 1     2     NA    NA    NA    1    
3 2     1     115   NA    NA    NA   
4 2     2     NA    no    NA    NA   
5 4     1     110   NA    54    NA   

方法2:使用data.table的dcast

如果你的数据量很大(几十万/百万行级别),data.table的dcast效率会更高,适合高性能数据处理场景:

library(data.table)

# 先将DataFrame转换为data.table对象
dt <- as.data.table(df)

wide_dt <- dcast(dt, id + shift ~ measurement, value.var = "critical_value")

得到的结果和方法1一致,输出格式为data.table:

id shift    A    B    C    D
1:  1     1  130  yes   55 <NA>
2:  1     2 <NA> <NA> <NA>    1
3:  2     1  115 <NA> <NA> <NA>
4:  2     2 <NA>   no <NA> <NA>
5:  4     1  110 <NA>   54 <NA>

补充说明

  • 转换后不存在的measurement对应的位置会填充NA,这是合理的(比如id=1 shift=1没有measurement=D的记录)
  • 如果需要替换NA为特定值(比如空字符串),可以在转换后用replace_na(tidyverse)或者nafill(data.table)处理

内容的提问来源于stack exchange,提问作者Hussain Rahiminejad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:24:11