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

