我试图从当前数据结构中找到Wanted数据结构。
我部分地了解了预期数据结构的原理图。
有用的数据结构包括另外一个list(...)
和factor
类。
当前数据结构
> print(dat.m)
[,1] [,2]
ave_max 150 61
ave 60 0
lepo 41 0
dat.m <- structure(c(150L, 60L, 41L, 61L, 0L, 0L), .Dim = c(3L, 2L), .Dimnames = list(
c("ave_max", "ave", "lepo"), NULL))
通缉数据结构
> print(dat.m)
Vars M1 M2
1 ave_max 150 61
2 ave 60 0
3 lepo 41 0
我知道这是示意性的,接近以下未知structure(c(...)
和row.names = c(...)
structure(list(Vars = structure(c(...), .Label = c("ave_max",
"ave", "lepo"), class = "factor"), M1 = c(150, 60,
41), M2 = c(61, 0, 0)), .Names = c("Vars", "ave_max", "ave",
"lepo"), class = "data.frame", row.names = c(...))
R:3.4.0(backports)
操作系统:Debian 8.7
答案 0 :(得分:1)
我们可以使用tidyverse
library(tidyverse)
dat.m %>%
as.data.frame() %>%
rownames_to_column('Vars') %>%
rename(M1 = V1, M2 = V2)
# Vars M1 M2
#1 ave_max 150 61
#2 ave 60 0
#3 lepo 41 0
如果我们需要使用data.table
library(data.table)
setnames(setDT(as.data.frame(dat.m), keep.rownames = TRUE), c('Vars', 'M1', 'M2'))[]
答案 1 :(得分:1)
如果您不坚持M1
,M2
等作为列名称,则会有更短的data.table
解决方案:
library(data.table) # CRAN version 1.10.4 used
as.data.table(dat.m, keep.rownames = "Vars")
# Vars V1 V2
#1: ave_max 150 61
#2: ave 60 0
#3: lepo 41 0
如果 坚持M1
,M2
等作为列名,而您的矩阵dat.m
包含许多列,则可以重命名列:
DT <- as.data.table(dat.m, keep.rownames = "Vars")
setnames(DT, stringr::str_replace(names(DT), "^V(?=\\d+$)", "M"))
DT
# Vars M1 M2
#1: ave_max 150 61
#2: ave 60 0
#3: lepo 41 0
正则表达式使用前瞻断言来确保仅更改以V
开头且紧随其后并以至少一位数结束的列。其他诸如Vars
,V
,V17b
,VV3
等其他内容未被触及。
如果您的矩阵有很多列,并且您的操作目的不仅仅是为了打印很好的列标题,您可以考虑将数据从宽到长整形。例如,ggplot
首选长格式。
DT_long <- melt(as.data.table(dat.m, keep.rownames = "Vars"), id.vars = "Vars")
DT_long
# Vars variable value
#1: ave_max V1 150
#2: ave V1 60
#3: lepo V1 41
#4: ave_max V2 61
#5: ave V2 0
#6: lepo V2 0
在长形式中,操作数据通常更容易,例如,重命名列:
DT_long[, variable := stringr::str_replace(variable, "^V", "M")]
DT_long
# Vars variable value
#1: ave_max M1 150
#2: ave M1 60
#3: lepo M1 41
#4: ave_max M2 61
#5: ave M2 0
#6: lepo M2 0
最后,你可以再次从长到大的形式重塑
dcast(DT_long, Vars ~ ...)
# Vars M1 M2
#1: ave 60 0
#2: ave_max 150 61
#3: lepo 41 0
请注意,演员公式会识别两个特殊变量:.
和...
。 .
代表无变量; ...
代表formula
中未提及的所有变量。 (有关详细信息,请参阅?data.table::dcast
。)