如何将含成对ID变量的宽格式DataFrame转换为长格式
宽转长DataFrame并处理缺失值解决方案
在R中可以用tidyverse工具集里的tidyr和dplyr快速完成这个转换,同时自动处理缺失值。
步骤1:构造完整示例数据
先补全你提供的示例数据框(原代码中缺少后两行的构造):
id_1 <- c(260, 500, 640, 720, 801, 440) id_2 <- c(261, 501, 641, 721, NA, 441) sleep_1 <- c(7, 3, 10, 6, 8, 4) sleep_2 <- c(8, 9, 1, 4, NA, 9) eat_1 <- c(6,8,4,2,5,3) eat_2 <- c(8,1,3,8,NA,6) df <- data.frame(id_1, id_2, sleep_1, sleep_2, eat_1, eat_2)
步骤2:宽转长并处理缺失值
使用pivot_longer拆分列名,再过滤掉无效的缺失行:
library(tidyverse) long_df <- df %>% pivot_longer( cols = everything(), # 选中所有列 names_to = c(".value", "suffix"), # 拆分列名为「变量名」和「后缀(1/2)」 names_sep = "_" # 按下划线拆分列名 ) %>% filter(!is.na(id)) # 过滤id为NA的行(对应原数据中id_2缺失的情况) %>% select(id, sleep, eat) # 调整列顺序为目标格式
转换结果
运行后得到的长格式数据框与你期望的完全一致:
> long_df # A tibble: 11 × 3 id sleep eat <dbl> <dbl> <dbl> 1 260 7 6 2 261 8 8 3 500 3 8 4 501 9 1 5 640 10 4 6 641 1 3 7 720 6 2 8 721 4 8 9 801 8 5 10 440 4 3 11 441 9 6
关键说明
names_sep = "_":直接按下划线拆分列名,把id_1拆成id(变量名)和1(后缀),sleep_2拆成sleep和2;.value参数:指定拆分后的第一部分作为新的列名(即保留原来的变量:id、sleep、eat);filter(!is.na(id)):自动剔除原数据中id_2为NA对应的无效行,同时保留id_1为801的有效数据。
内容的提问来源于stack exchange,提问作者wooden05
相关产品推荐
相关产品推荐

