如何将数据框重塑为长格式并去除NA值?解决reshape报错问题
解决数据重塑错误并生成目标长格式
错误原因分析
你遇到的'varying' arguments must be the same length错误,核心问题有两个:
reshape()的varying参数中,两个列表长度不匹配:第一个列表包含4个Researcher变量,第二个只有3个revisit变量- 变量名书写错误:实际数据里是
Researcher1/revisit1(无空格),但代码里写成了Researcher 1/revisit 1
正确解决方案
推荐用tidyr包的pivot_longer函数,比base R的reshape更直观,能直接生成无NA的长格式:
步骤1:加载包并重现数据
library(tidyr) library(dplyr) # 还原你的原始数据 survey <- data.frame( zone = c(3,3,1,1,2,2,4,4), situation = c("Answered","Refusal","Answered","Refusal","Answered","Refusal","Answered","Refusal"), Researcher1 = c(NA,NA,10,7,NA,NA,NA,NA), Researcher2 = c(NA,NA,NA,NA,15,3,NA,NA), Researcher3 = c(4,15,NA,NA,NA,NA,NA,NA), Researcher4 = c(NA,NA,NA,NA,NA,NA,13,8), revisit1 = c(NA,NA,2,5,3,0,NA,NA), revisit2 = c(10,5,NA,NA,NA,NA,NA,NA), revisit3 = c(NA,NA,NA,NA,NA,NA,4,4) )
步骤2:重塑为无NA的长格式
long_rsch <- survey %>% # 转换Researcher系列列为长格式,自动丢弃NA pivot_longer(cols = starts_with("Researcher"), names_to = "team", values_to = "first_team", values_drop_na = TRUE) %>% # 转换revisit系列列为长格式,自动丢弃NA pivot_longer(cols = starts_with("revisit"), names_to = "revisit_team", values_to = "Revisit", values_drop_na = TRUE) %>% # 清理team名称(去掉前缀,只保留数字) mutate(team = gsub("Researcher", "", team), revisit_team = gsub("revisit", "", revisit_team)) %>% # 按分区和应答情况排序 arrange(zone, situation)
最终输出结果
运行后得到的结果与你的期望一致:
| zone | situation | team | first_team | revisit_team | Revisit |
|---|---|---|---|---|---|
| 1 | Answered | 1 | 10 | 1 | 2 |
| 1 | Refusal | 1 | 7 | 1 | 5 |
| 2 | Answered | 2 | 15 | 1 | 3 |
| 2 | Refusal | 2 | 3 | 1 | 0 |
| 3 | Answered | 3 | 4 | 2 | 10 |
| 3 | Refusal | 3 | 15 | 2 | 5 |
| 4 | Answered | 4 | 13 | 3 | 4 |
| 4 | Refusal | 4 | 8 | 3 | 4 |
若坚持使用base R的reshape函数
需要补全varying列表长度,同时修正变量名:
long_rsch_base <- reshape(survey, direction = "long", idvar = c("zone", "situation"), varying = list(c("Researcher1","Researcher2","Researcher3","Researcher4"), c("revisit1","revisit2","revisit3",NA)), # 补NA让两个列表长度一致 v.names = c("first_team", "Revisit"), times = c(1,2,3,4), timevar = "team") %>% na.omit() %>% arrange(zone, situation)
内容的提问来源于stack exchange,提问作者Kledson Lemes
相关产品推荐
相关产品推荐

