转置data.table的最佳方法

Vas*_*y A 34 r data.table

我经常需要转换一个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
Run Code Online (Sandbox Code Playgroud)

只需转置它t(),它将转换为矩阵并转换为character类型,而应用于data.table此类矩阵将丢失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
Run Code Online (Sandbox Code Playgroud)

所以我不得不为此写一个函数:

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
Run Code Online (Sandbox Code Playgroud)

有什么我可以在这里优化或以"更好"的方式做到这一点?

A5C*_*2T1 38

为什么不meltdcastdata.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
Run Code Online (Sandbox Code Playgroud)


sha*_*dow 18

这是一种替代解决方案,仅使用data.table并且更接近于使用t转置的原始想法.

mydata[, data.table(t(.SD), keep.rownames=TRUE), .SDcols=-"col0"]
##      rn V1 V2 V3
## 1: col1 11 21 31
## 2: col2 12 22 32
## 3: col3 13 23 33
Run Code Online (Sandbox Code Playgroud)

如果保持rownames很重要,setnames可以使用.不可否认,这变得有点笨拙,可能重铸解决方案更可取.

setnames(mydata[, data.table(t(.SD), keep.rownames=TRUE), .SDcols=-"col0"], 
         mydata[, c('rn', col0)])[]
##      rn row1 row2 row3
## 1: col1   11   21   31
## 2: col2   12   22   32
## 3: col3   13   23   33
Run Code Online (Sandbox Code Playgroud)

  • 这种方法当然更容易理解.顺便说一句,`data.table`的v1.9.5的发行说明表明`melt`和'dcast`很快就不需要`reshape2`.https://github.com/Rdatatable/data.table#changes-in-v195--in-development-on-github (2认同)

aba*_*ter 15

当前文档显示内建transpose方法.我不知道什么时候添加它,但显然它是需要的!

  • 这应该是要走的路.但目前它并没有将列名保持为rownames.打开https://github.com/Rdatatable/data.table/issues/1886有一个问题要求它.我想如果我们在那里投票,它将会更早实施. (5认同)
  • 万一其他人遇到麻烦:我必须将其显式调用为“data.table::transpose()”,以免得到 purrr 的 transpose()。 (3认同)

小智 8

df <- as.data.frame(t(mydata))
Run Code Online (Sandbox Code Playgroud)

是我尝试过的,df是 adata.frame并且上的列名称mydata现在是行名称df