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

如何使用R代码去除数据集NA值并按ID整理重塑为目标宽表

需求实现方案

这个需求完全可以实现,不需要用pivot_longer,搭配dplyr和tidyr的函数组合就能轻松完成,具体步骤和代码如下:

步骤说明

  • 第一步:删除所有包含NA的行,保留有效观测
  • 第二步:按ID、Name、Surname这三个用户唯一标识分组,给每个用户下的有效行生成序号(用来后续做宽表的后缀标识)
  • 第三步:用pivot_wider把长表转成需要的宽格式即可

完整代码

# 加载需要的包
library(dplyr)
library(tidyr)

# 示例数据
df<-read.table (text="ID  Name    Surname Group   A1  A2  A3  Goal    Sea
    21  Goal    Robi    A   4   4   4   G   No
    21  Goal    Robi    B   NA  NA  NA  NA  NA
    21  Goal    Robi    C   NA  NA  NA  NA  NA
    21  Goal    Robi    D   3   4   4   G   No
    33  Nami    Si  O   NA  NA  NA  NA  NA
    33  Nami    Si  P   NA  NA  NA  NA  NA
    33  Nami    Si  Q   3   4   4   G   No
    33  Nami    Si  Z   3   3   3   S   No
    98  Sara    Bat MT  4   4   4   S   No
    98  Sara    Bat NC  4   3   2   D   No
    98  Sara    Bat MF  NA  NA  NA  NA  NA
    98  Sara    Bat LC  NA  NA  NA  NA  NA
    66  Noor    Shor    MF  NA  NA  NA  NA  NA
    66  Noor    Shor    LC  NA  NA  NA  NA  NA
    66  Noor    Shor    MT1 4   4   4   G   No
    66  Noor    Shor    NC1 2   3   3   D   No
    ", header=TRUE)

# 核心处理代码
result <- df %>%
  # 删除所有含NA的行
  drop_na() %>%
  # 按用户维度分组生成组内序号
  group_by(ID, Name, Surname) %>%
  mutate(grp_id = row_number()) %>%
  ungroup() %>%
  # 转宽格式
  pivot_wider(
    id_cols = c(ID, Name, Surname),
    names_from = grp_id,
    values_from = c(Group, A1, A2, A3, Goal, Sea),
    names_sep = "_"
  )

# 输出结果
print(result)

输出说明

运行代码得到的结果和需求预期的数据逻辑完全一致,列名会按序号自动生成后缀,如果同一个ID下有多于2条有效数据,也会自动生成Group_3、A1_3等对应列,适配性更强。

注:你给出的期望输出示例中A1、A2、A3无后缀、A2_2、A3_3属于笔误,上述代码生成的是统一规则的列名格式:Group_1、A1_1、A2_1、A3_1、Goal_1、Sea_1、Group_2、A1_2、A2_2、A3_2、Goal_2、Sea_2,如果需要完全匹配你写的自定义列名,额外加一步rename操作即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:54:03