如何用tidyverse或R基础函数替代reshape2::dcast实现相同输出?
替代reshape2::dcast的tidyverse与R基础方案
想知道在以下代码中,是否存在tidyverse或R基础函数可以替代
reshape2::dcast,以生成相同的输出?
dat=structure(list(row = c("L2DA", "L2DA", "L2DA", "L2DA", "L2DA", "L2DA", "L2DF", "L2DF", "L2DF", "L2DF", "L2DF", "L2G", "L2G", "L2G", "L2M", "L2P", "L2P", "L2R", "L2R", "L2R", "L2R", "L2R", "L2R", "L2R", "L2V", "L2V", "L2V", "L2V", "L2DF", "L2G", "L2L", "L2M", "L2P", "L2V", "L2G", "L2L", "L2M", "L2P", "L2V", "L2L", "L2M", "L2P", "L2L", "L2L", "L2M", "L2DA", "L2DF", "L2G", "L2L", "L2M", "L2P", "L2V", "L2G", "L2L", "L2M", "L2P"), col = c("L2DF", "L2G", "L2L", "L2M", "L2P", "L2V", "L2G", "L2L", "L2M", "L2P", "L2V", "L2L", "L2M", "L2P", "L2L", "L2L", "L2M", "L2DA", "L2DF", "L2G", "L2L", "L2M", "L2P", "L2V", "L2G", "L2L", "L2M", "L2P", "L2DA", "L2DA", "L2DA", "L2DA", "L2DA", "L2DA", "L2DF", "L2DF", "L2DF", "L2DF", "L2DF", "L2G", "L2G", "L2G", "L2M", "L2P", "L2P", "L2R", "L2R", "L2R", "L2R", "L2R", "L2R", "L2R", "L2V", "L2V", "L2V", "L2V"), R = c(0.64, 0.55, 0.42, 0.56, 0.57, 0.48, 0.37, 0.24, 0.29, 0.48, 0.35, 0.48, 0.57, 0.29, 0.51, 0.33, 0.48, 0.58, 0.46, 0.52, 0.56, 0.49, 0.47, 0.51, 0.53, 0.52, 0.53, 0.42, 0.64, 0.55, 0.42, 0.56, 0.57, 0.48, 0.37, 0.24, 0.29, 0.48, 0.35, 0.48, 0.57, 0.29, 0.51, 0.33, 0.48, 0.58, 0.46, 0.52, 0.56, 0.49, 0.47, 0.51, 0.53, 0.52, 0.53, 0.42)), row.names = c(NA, -56L), class = "data.frame") # 原dcast代码 reshape2::dcast(dat, row ~ col, value.var = "R")
原输出:
row L2DA L2DF L2G L2L L2M L2P L2R L2V 1 L2DA NA 0.64 0.55 0.42 0.56 0.57 0.58 0.48 2 L2DF 0.64 NA 0.37 0.24 0.29 0.48 0.46 0.35 3 L2G 0.55 0.37 NA 0.48 0.57 0.29 0.52 0.53 4 L2L 0.42 0.24 0.48 NA 0.51 0.33 0.56 0.52 5 L2M 0.56 0.29 0.57 0.51 NA 0.48 0.49 0.53 6 L2P 0.57 0.48 0.29 0.33 0.48 NA 0.47 0.42 7 L2R 0.58 0.46 0.52 0.56 0.49 0.47 NA 0.51 8 L2V 0.48 0.35 0.53 0.52 0.53 0.42 0.51 NA
解决方案
1. Tidyverse方案:tidyr::pivot_wider
这是tidyverse生态中替代dcast的官方函数,语法简洁,完全匹配原输出:
library(tidyverse) dat %>% pivot_wider(names_from = col, values_from = R, values_fill = list(R = NA)) %>% arrange(row)
2. R基础方案:reshape函数
无需额外安装包,用基础R的reshape函数即可实现:
reshape(dat, idvar = "row", timevar = "col", direction = "wide", v.names = "R") %>% arrange(row)
3. R基础方案:xtabs函数(需格式调整)
xtabs会生成交叉表对象,需要转换为数据框并处理默认填充的0值:
tab <- xtabs(R ~ row + col, data = dat) as.data.frame.matrix(tab) %>% mutate(row = rownames(.)) %>% relocate(row) %>% mutate(across(-row, ~ ifelse(. == 0, NA, .))) %>% arrange(row)
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

