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

R语言长表转宽表:按Distance和trial拆分HR_ECG与smoothy字段

R语言长格式数据集转宽格式实现方案

实现思路

使用tidyr包的pivot_wider()函数完成透视转换,提前对Distance字段做值映射,将0替换为close、1替换为far,再按规则生成新字段名即可。

完整可运行代码

# 加载依赖包
library(tidyverse)

# 加载示例数据集(实际使用时替换为自己的数据集即可)
df <- structure(list(progNum = c(12, 13, 14, 15, 17, 18, 19, 20, 22, 
23, 24, 25, 27, 28, 29, 30), SbjID = c(456465465, 456465465, 
456465465, 456465465, 456465465, 456465465, 456465465, 456465465, 
64846846846, 64846846846, 64846846846, 64846846846, 64846846846, 
64846846846, 64846846846, 64846846846), age = c("19", "19", "19", 
"19", "19", "19", "19", "19", "19", "19", "19", "19", "19", "19", 
"19", "19"), gender = c("Male", "Male", "Male", "Male", "Male", 
"Male", "Male", "Male", "Male", "Male", "Male", "Male", "Male", 
"Male", "Male", "Male"), smoothy = c(77.9221097737332, 78.5599580813492, 
75.8424141201793, 78.6216428610833, 81.4167032250805, 76.9509617898643, 
83.5251636058245, 76.5866099353627, 86.6511432503543, 86.3901538762173, 
84.6411757168127, 87.0600014771307, 85.3731055604431, 81.5935438011446, 
83.38581442316, 85.2329422916703), nFrames = c(599, 838, 1078, 
2397, 599, 839, 1078, 2397, 599, 838, 1079, 2397, 598, 839, 1079, 
2396), vidDuration = c(24.984, 34.952, 44.962, 99.975, 24.984, 
34.994, 44.962, 99.975, 24.984, 34.952, 45.004, 99.975, 24.942, 
34.994, 45.004, 99.934), frameRate = c(23.9353186039065, 23.947127489128, 
23.9535607846626, 23.9659914978745, 23.9353186039065, 23.9469623364005, 
23.9535607846626, 23.9659914978745, 23.9353186039065, 23.947127489128, 
23.9534263621012, 23.9659914978745, 23.935530430599, 23.9469623364005, 
23.9534263621012, 23.9658174395101), trial = c(25, 35, 45, 100, 
25, 35, 45, 100, 25, 35, 45, 100, 25, 35, 45, 100), allTaskSecs = c("25", 
"35", "45", "100", "25_Far", "35_Far", "45_Far", "100_Far", "25", 
"35", "45", "100", "25_Far", "35_Far", "45_Far", "100_Far"), 
    Names = c("A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", 
    "A1", "A2", "A2", "A2", "A2", "A2", "A2", "A2"), Beats = c(33, 
    46, 62, 130, 31, 47, 58, 132, 36, 48, 63, 144, 37, 52, 65, 
    146), Distance = c(0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
    1, 1, 1), rPPGEstimatedBeats = c(32.4675457390555, 45.8266422141203, 
    56.8818105901344, 131.036071435139, 33.9236263437836, 44.8880610440875, 
    62.6438727043684, 127.644349892271, 36.1046430209809, 50.3942564277934, 
    63.4808817876095, 145.100002461884, 35.5721273168513, 47.596233884001, 
    62.53936081737, 142.05490381945), estimatedBeatsSmoothy = c(32.4675457390555, 
    45.8266422141203, 56.8818105901344, 131.036071435139, 33.9236263437836, 
    44.8880610440875, 62.6438727043684, 127.644349892271, 36.1046430209809, 
    50.3942564277934, 63.4808817876095, 145.100002461884, 35.5721273168513, 
    47.596233884001, 62.53936081737, 142.05490381945), HR_ECG = c(79.2, 
    78.8571428571429, 82.6666666666667, 78, 74.4, 80.5714285714286, 
    77.3333333333333, 79.2, 86.4, 82.2857142857143, 84, 86.4, 
    88.8, 89.1428571428571, 86.6666666666667, 87.6), Name = c("A1", 
    "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A2", "A2", 
    "A2", "A2", "A2", "A2", "A2")), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -16L))

# 转换核心代码
df_wide <- df %>%
  # 映射Distance字段值
  mutate(distance_label = case_when(
    Distance == 0 ~ "close",
    Distance == 1 ~ "far"
  )) %>%
  # 长转宽透视
  pivot_wider(
    # 保留所有不需要拆分的原有字段
    id_cols = everything(),
    # 新字段名来源
    names_from = c(distance_label, trial),
    # 要拆分的值字段
    values_from = c(HR_ECG, smoothy),
    # 新字段名命名规则,完全符合需求
    names_glue = "{.value}_{distance_label}_{trial}"
  ) %>%
  # 可选:如果不需要中间生成的distance_label字段可以删掉
  select(-distance_label)

结果说明

运行后得到的df_wide就会包含你需要的所有字段,除了原有所有变量外,会自动生成HR_ECG_close_25、HR_ECG_close_35直到smoothy_far_100共16个拆分后的新字段。如果你的全量数据集里有示例里没出现的其他字段(比如ethnicity、skinTone等),代码会自动保留不需要额外调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:24:07