R语言如何对数据集部分列做长宽转换且保留其余列数值
问题原因
你之前使用gather()得到错误结果,是参数传递错误导致的:gather()函数的前两个输入参数分别是转换后生成的分类列名称和值列名称,你误将需要保留的year、site填到了这两个参数位,导致原有标识列被覆盖,输出结果不符合预期。
解决方案
你需要实现的是典型的宽表转长表操作,无需额外新增ID列合并,单函数即可完成转换,以下两种写法都适用:
方法1:gather() 语法(兼容旧版tidyr)
通过负号指定不需要参与转换的保留列即可:
library(tidyr) df_res <- gather(df, key = "type", value = "count", -year, -site)
方法2:pivot_longer() 语法(新版tidyr推荐,语义更清晰)
library(tidyr) df_res <- pivot_longer( df, cols = -c(year, site), # 除year、site外的所有列参与转换,也可显式写cols=c(square,triangle,circle) names_to = "type", # 原列名存入新字段type values_to = "count" # 原数值存入新字段count )
两种方法输出的结果均完全符合你需要的结构,NA值也会完整保留不会丢失。
内容的提问来源于stack exchange,提问作者cgxytf
相关产品推荐
相关产品推荐

