在R中如何将指定列转置为表头?以iris数据集为例
实现方案
注意:iris数据集中每个物种对应50条重复观测,直接将Species列的唯一值设为表头,需要先为同物种的观测添加匹配索引,否则无法确定多行值如何对应到新列下
方法1:tidyverse 方案(适配你已经在使用的dplyr语法)
library(tidyverse) iris_wide <- iris %>% # 按物种分组添加内部行号,用来匹配不同物种同一位置的观测 group_by(Species) %>% mutate(row_id = row_number()) %>% ungroup() %>% # 长表转宽表,表头取Species的唯一值 pivot_wider( id_cols = row_id, names_from = Species, values_from = c(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) ) %>% # 不需要行号的话可以删除该列 select(-row_id) head(iris_wide)
如果需要将测量指标作为行、物种作为列展示,只需要调整pivot_wider的参数即可。
方法2:reshape2 melt + dcast 方案(适配你尝试的melt函数用法)
library(reshape2) # 先将数据融化为长格式 iris_melt <- melt(iris, id.vars = "Species") # 为同物种的观测添加行索引 iris_melt$row_id <- ave(rep(1, nrow(iris_melt)), iris_melt$Species, FUN = cumsum) # 转宽表,Species作为表头 iris_wide <- dcast(iris_melt, row_id + variable ~ Species, value.var = "value") head(iris_wide)
原代码报错原因说明
- 你直接将
distinct(Species)返回的3行tibble赋值给长度为5的列名向量,长度不匹配导致报错 - 直接转置
t(iris)会因为Species是因子类型,强制将所有数值转为字符,丢失数值属性 melt是用来将宽表转长表的函数,无法直接实现将列值转为表头的需求,需要搭配dcast使用
内容的提问来源于stack exchange,提问作者TeeRow
相关产品推荐
相关产品推荐

