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

在R中旋转dataframe遇t()函数报错,求正确实现方法

嘿,我来帮你搞定这个DataFrame转置的问题!你遇到的t()报错,是因为直接用它处理混合类型的DataFrame时,会把整个数据转成矩阵(矩阵只能有一种数据类型),后续转回DataFrame时就会出现类型不匹配的问题。

先看你的原始数据:

d <- data.frame( A = c("Att1","Att2"), b = c(12,10), c =c(8,9), d =c (1,2))

方法一:用tidyverse(推荐,更直观)

先用pivot_longer把宽表转成长表,再用pivot_wider转成你想要的格式,还能顺便把列名转成大写:

library(tidyverse)

# 第一步:把b/c/d列拆成name和value两列
d_long <- d %>%
  pivot_longer(cols = -A, names_to = "name", values_to = "value")

# 第二步:把Att1/Att2转成列,name作为行标识
d2 <- d_long %>%
  pivot_wider(names_from = A, values_from = value) %>%
  mutate(name = str_to_upper(name)) # 把name转成大写的B/C/D

运行后得到的d2就是你想要的结构(纠正了你期望里的小笔误,Att1对应的值应该是12/8/1,Att2是10/9/2):

# A tibble: 3 × 3
  name  Att1 Att2
  <chr> <dbl> <dbl>
1 B        12    10
2 C         8     9
3 D         1     2

方法二:用Base R(不依赖第三方包)

如果不想用tidyverse,可以手动处理行名和转置:

# 把A列设为行名,去掉原A列
d_row <- d
rownames(d_row) <- d_row$A
d_row$A <- NULL

# 转置后转成DataFrame,把行名转为name列,再转大写
d2_base <- as.data.frame(t(d_row)) %>%
  rownames_to_column("name") %>%
  mutate(name = toupper(name))

这个方法得到的结果和上面完全一致。

总结一下:直接用t()处理混合类型的DataFrame容易踩类型的坑,用tidyverse的重塑函数或者手动处理行名的Base R方法,能更稳妥地得到你想要的转置结果~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:30:07