R中recast函数转换数据丢失物种关键列如何解决
问题原因
你写的recast(df, site ~ month)没有将物种维度纳入分组规则,函数会默认对所有未出现在公式中的字段做计数聚合,因此会丢失spA-spD的具体数值,输出无意义的统计结果。
要得到目标格式,需要先把宽格式存储的4列物种数据转成长格式,拆分出独立的物种标识列,再以「站点+物种」为行维度、月份为列维度做宽表转换。
实现方法
方法1:沿用reshape2包实现
你可以先用melt完成宽转长拆分物种列,再用dcast做最终的行列转换:
library(reshape2) # 第一步:将spA-spD四列转为长格式,拆分出独立的物种列 df_long <- melt(df, id.vars = c("month", "site"), # 指定保留的维度列 variable.name = "sp", # 物种列命名 value.name = "val") # 物种对应数值列命名 # 第二步:按site+sp为行、month为列做宽表转换 df_res <- dcast(df_long, site + sp ~ month, value.var = "val")
如果要直接用recast一步完成,可以合并两步逻辑:
df.test <- recast(df, measure.vars = c("spA","spB","spC","spD"), # 指定要处理的物种列 site + variable ~ month) # 可选:去掉物种名自带的sp前缀,只保留A/B/C/D df.test$sp <- gsub("sp", "", df.test$variable) df.test <- df.test[, c("site", "sp", "J", "F", "M")]
方法2:用tidyr包实现(当前主流的简洁写法)
如果不限制必须使用reshape2,用tidyr的长宽转换函数逻辑更直观,代码可读性更高:
library(tidyr) library(dplyr) df_res <- df %>% # 先把sp开头的物种列转成长格式,直接去掉sp前缀 pivot_longer(cols = starts_with("sp"), names_to = "sp", values_to = "val", names_prefix = "sp") %>% # 再把月份维度转为列 pivot_wider(names_from = month, values_from = val)
输出效果
运行后得到的结果结构和预期完全一致,前几行示例如下:
site sp J F M 1 1 A -2.3495117 0.4996352 -0.1203332 2 1 B 0.2746017 -1.8104949 -1.4079240 3 1 C 0.1402782 -2.0587470 -0.5189010 4 1 D 0.4392508 -0.2988978 0.8250460 ...
内容的提问来源于stack exchange,提问作者Rspacer
相关产品推荐
相关产品推荐

