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

