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

R语言长格式数据框转宽格式遇阻,已尝试多函数求解决方法

R语言:长格式转宽格式的正确实现

原始数据

my.df <- data.frame(
  species = c("A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D"),
  site = c(1,1,1,1,2,2,2,2,3,3,3,3),
  abundance = c(0,2,8,1,4,0,0,0,1,2,8,1)
)

你之前尝试的代码问题点

  • t(my.df):这是对整个数据框转置,不是长转宽的重塑操作,不符合需求。
  • melt():该函数是把宽格式转成长格式,你本来就是长格式,用反了。
  • dcast():公式写反了(应该是site ~ species而非species ~ site),且不需要给变量加引号。
  • pivot_wider():names_from参数写错了,原始数据里的列名是species不是spp,且不需要values_fn = list(每个site-species组合唯一,无需聚合)。

正确实现方法

方法1:Base R的reshape函数

reshape(my.df, idvar = "site", timevar = "species", direction = "wide")

输出结果:

site abundance.A abundance.B abundance.C abundance.D
1    1           0           2           8           1
5    2           4           0           0           0
9    3           1           2           8           1

如果需要简化列名:

result <- reshape(my.df, idvar = "site", timevar = "species", direction = "wide")
colnames(result) <- gsub("abundance\\.", "", colnames(result))

方法2:reshape2包的dcast函数

library(reshape2)
dcast(my.df, site ~ species, value.var = "abundance")

输出结果:

site A B C D
1    1 0 2 8 1
2    2 4 0 0 0
3    3 1 2 8 1

方法3:tidyr包的pivot_wider函数

library(tidyr)
library(dplyr)

my.df %>%
  pivot_wider(names_from = species, values_from = abundance)

输出结果:

# A tibble: 3 × 5
   site     A     B     C     D
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     0     2     8     1
2     2     4     0     0     0
3     3     1     2     8     1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:05:26