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

如何在R中将含多分类变量的特殊宽格式数据转换为指定长格式?

在R中实现非传统宽长格式转换的解决方案

直接用dplyr和tidyr就能实现,代码如下:

library(dplyr)
library(tidyr)

# 原始数据
df <- data.frame(v1 = c("a", "a", "a", "a", "a", "a"),
                 v5 = c("c1", "c2", NA, "c1", "c2", NA),
                 v6 = c(20, 30, NA, 14, 26, NA),
                 v7 = c("d1", "d2", "d3", "d1", "d2", "d3"),
                 v8 = c(2, 3, 4, 5, 6, 7))

# 拆分数据为两个独立块
df_block1 <- df[1:3, ]
df_block2 <- df[4:6, ]

# 处理第一块数据
processed_block1 <- bind_rows(
  # 提取v5和v6的有效配对(过滤NA)
  df_block1 %>%
    drop_na(v5, v6) %>%
    mutate(Variable = "v5") %>%
    rename(Var_category = v5, var_value = v6) %>%
    select(v1, Variable, Var_category, var_value),
  # 提取v7和v8的配对
  df_block1 %>%
    mutate(Variable = "v7") %>%
    rename(Var_category = v7, var_value = v8) %>%
    select(v1, Variable, Var_category, var_value)
)

# 处理第二块数据
processed_block2 <- bind_rows(
  # 提取v5和v6的有效配对(过滤NA)
  df_block2 %>%
    drop_na(v5, v6) %>%
    mutate(Variable = "v5") %>%
    rename(Var_category = v5, var_value = v6) %>%
    select(v1, Variable, Var_category, var_value),
  # 提取v7和v8的配对,这里Variable设为v6
  df_block2 %>%
    mutate(Variable = "v6") %>%
    rename(Var_category = v7, var_value = v8) %>%
    select(v1, Variable, Var_category, var_value)
)

# 合并两个块得到最终结果
final_df <- bind_rows(processed_block1, processed_block2)

# 输出结果
print(final_df)

转换逻辑说明

原数据并非传统的宽格式,核心是它被分成了两个独立的数据块(前3行和后3行),每个块的转换规则有细微差异:

  • 第一块:v5与v6配对(去掉NA行),v7与v8配对
  • 第二块:v5与v6配对(去掉NA行),v7与v8配对但变量名标记为v6

通过拆分块分别处理,再合并结果,就能精准得到目标格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:43:26