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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:05:56