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
为什么不melt
和dcast
的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
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)
小智 8
df <- as.data.frame(t(mydata))
Run Code Online (Sandbox Code Playgroud)
是我尝试过的,df
是 adata.frame
并且上的列名称mydata
现在是行名称df