如何在R中按数据框首列时间戳合并行,实现单时间戳单行?
解决方案
1. 合并行:每个时间戳对应一行
针对你提供的table1,可以通过按time和buoy分组,提取每个深度列的非NA值实现合并行的需求:
library(tidyverse) table1 <- tribble( ~time, ~buoy, ~depth1, ~depth2, ~depth3, "t1", "b1", NA, NA, "value", "t1", "b1", NA, "value", NA, "t1", "b1", "value", NA, NA, "t2", "b1", NA, NA, "value", "t2", "b1", NA, "value", NA, "t2", "b1", "value", NA, NA ) # 合并行:每个time+buoy组保留非NA值 merged_table <- table1 %>% group_by(time, buoy) %>% summarize( depth1 = first(na.omit(depth1)), depth2 = first(na.omit(depth2)), depth3 = first(na.omit(depth3)), .groups = "drop" ) merged_table
运行后得到的结果即为每个时间戳对应一行,各深度列均有有效值:
# A tibble: 2 × 5 time buoy depth1 depth2 depth3 <chr> <chr> <chr> <chr> <chr> 1 t1 b1 value value value 2 t2 b1 value value value
2. 转换为以深度为变量的长格式
如果需要的是长格式(每行对应一个时间-浮标-深度的组合),可在合并后用pivot_longer重塑数据:
long_format <- merged_table %>% pivot_longer( cols = starts_with("depth"), names_to = "depth", values_to = "value" ) long_format
结果如下:
# A tibble: 6 × 4 time buoy depth value <chr> <chr> <chr> <chr> 1 t1 b1 depth1 value 2 t1 b1 depth2 value 3 t1 b1 depth3 value 4 t2 b1 depth1 value 5 t2 b1 depth2 value 6 t2 b1 depth3 value
3. 从宽格式(table2样式)转回目标格式
若你已有table2这类以深度为行、时间为列的宽格式数据,可通过两次重塑转换为时间为行、深度为列的格式:
table2 <- tribble( ~depth, ~buoy, ~time1, ~time2, "depth1", "b1", "value", "value", "depth2", "b1", "value", "value", "depth3", "b1", "value", "value" ) # 先转成长格式,再重塑为时间为行的宽格式 target_format <- table2 %>% pivot_longer( cols = starts_with("time"), names_to = "time", values_to = "value" ) %>% pivot_wider( names_from = depth, values_from = value ) target_format
结果:
# A tibble: 2 × 4 time buoy depth1 depth2 depth3 <chr> <chr> <chr> <chr> <chr> 1 time1 b1 value value value 2 time2 b1 value value value
内容的提问来源于stack exchange,提问作者Jade Hinson
相关产品推荐
相关产品推荐

