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

