如何在R中获得此数据结构?

时间:2017-05-21 16:54:41

标签: r data-structures

我试图从当前数据结构中找到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

2 个答案:

答案 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)

如果您坚持M1M2等作为列名称,则会有更短的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

如果 坚持M1M2等作为列名,而您的矩阵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开头且紧随其后并以至少一位数结束的列。其他诸如VarsVV17bVV3等其他内容未被触及。

如果您的矩阵有很多列,并且您的操作目的不仅仅是为了打印很好的列标题,您可以考虑将数据从宽到长整形。例如,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。)