[更新:data.table软件包中现在有一个原生的transpose()函数]

我经常需要转换data.table,每次需要几行代码,我想知道是否有比我更好的解决方案.

如果我们拿样品台

library(data.table)
mydata <- data.table(col0=c("row1","row2","row3"),
                     col1=c(11,21,31),
                     col2=c(12,22,32),
                     col3=c(13,23,33))

mydata
# col0 col1 col2 col3
# row1   11   12   13
# row2   21   22   23
# row3   31   32   33

只需将其转换为t(),它将被转换为character类型的矩阵,而将data.table应用于该矩阵将失go row.names:

t(mydata)
# [,1]   [,2]   [,3]  
# col0 "row1" "row2" "row3"
# col1 "11"   "21"   "31"  
# col2 "12"   "22"   "32"  
# col3 "13"   "23"   "33"  

data.table(t(mydata))
#   V1   V2   V3
# row1 row2 row3
#   11   21   31
#   12   22   32
#   13   23   33

所以我必须为此编写一个函数:

tdt <- function(inpdt){
  transposed <- t(inpdt[,-1,with=F]);
  colnames(transposed) <- inpdt[[1]];
  transposed <- data.table(transposed, keep.rownames=T);
  setnames(transposed, 1, names(inpdt)[1]);
  return(transposed);
}

 tdt(mydata)
# col0 row1 row2 row3
# col1   11   21   31
# col2   12   22   32
# col3   13   23   33

这里有什么我可以优化的,或者用"更好"的方式优化的吗?

推荐答案

为什么不把meltdcast换成data.table呢?

require(data.table)

dcast(melt(mydata, id.vars = "col0"), variable ~ col0)
#    variable row1 row2 row3
# 1:     col1   11   21   31
# 2:     col2   12   22   32
# 3:     col3   13   23   33

R相关问答推荐

将收件箱变量传递给ggplot 2函数

R数据帧中的布尔加法会产生布尔值而不是整值

如何将log 2刻度上的数字转换为自然log

如何将具有重复名称的收件箱合并到R中的另一列中,而结果不同?

根据固定值范围在tible中添加新行

列出用m n个值替换来绘制n个数字的所有方法(i.o.w.:R中大小为n的集合的所有划分为m个不同子集)

R Lubridate:舍入/快照日期时间到一天中最近的任意时间?

基于现有类创建类的打印方法(即,打印tibles更长时间)

找出疾病消失的受试者

大规模重新标记haven标签数据

如何删除gggvenn与gggplot绘制的空白?

在数学中正确显示摄氏度、开氏度或华氏度

par函数中的缩写,比如mgp,mar,mai是如何被破译的?

R中1到n_1,2到n_2,…,n到n_n的所有组合都是列表中的向量?

从服务器在Shiny中一起渲染图标和文本

仅在R中的数据集开始和结束时删除所有 Select 列的具有NA的行

在R中创建连续的期间

使用ggplot2中的sec_axis()调整次轴

有没有办法将基于每个值中出现的两个关键字或短语的字符串向量重新编码为具有这两个值的新向量?

将美学添加到ggploy中的文本标签