如何合并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
相关产品推荐
相关产品推荐

