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

如何将含成对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:22:42