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
相关产品推荐
相关产品推荐

