如何使用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
相关产品推荐
相关产品推荐

