/ / Ako získať tento dcast'able dlhý stôl v R? - r, dátové štruktúry

Ako získať túto dcast'able dlhú tabuľku v R? - r, dátové štruktúry

Snažím sa prihlásiť dcast na dlhom stole, pokračovanie z odpovede vlákna Ako získať túto dátovú štruktúru v R? kód

dat.m <- structure(c(150L, 60L, 41L, 61L, 0L, 0L), .Dim = c(3L, 2L), .Dimnames = list(
c("ave_max", "ave", "lepo"), NULL))
library("ggplot2")
library("data.table")
dat.m <- melt(as.data.table(dat.m, keep.rownames = "Vars"), id.vars = "Vars") # https://stackoverflow.com/a/44128640/54964
dat.m

print("New step")
# http://stackoverflow.com/a/44090815/54964
minmax <- dat.m[dat.m$Vars %in% c("ave_max","lepo"), ]
absol  <- dat.m[dat.m$Vars %in% c("ave"), ]
#minm   <- dcast(minmax, Vars ~ variable)
minm   <- dcast(minmax, Vars ~ ...)
absol <- merge(absol, minm, by = "Vars", all.x = T)

absol

#Test function
ggplot(absol, aes(x = Vars, y = value, fill = variable)) +
geom_bar(stat = "identity") +
geom_errorbar(aes(ymin = lepo, ymax = ave_max), width = .25)

Výkon

dcast, melt

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
[1] "New step"
Vars variable value V1 V2
1:  ave       V1    60 NA NA
2:  ave       V2     0 NA NA
Error in FUN(X[[i]], ...) : object "lepo" not found
Calls: <Anonymous> ... by_layer -> f -> <Anonymous> -> f -> lapply -> FUN -> FUN
Execution halted

Očakávaný výstup: prejsť testovacou funkciou ggplot

Testovanie Uweovho návrhu

Cieľom je dostať sa k tejto dátovej štruktúre

dat.m <- structure(c(150L, 60L, 41L, 61L, 0L, 0L), .Dim = c(3L, 2L), .Dimnames = list(c("ave_max", "ave", "lepo"), NULL))

z tejto dátovej štruktúry

dat.m <- structure(list(ave_max = c(15L, 6L), ave = c(6L, NA), lepo = c(4L, NA)), .Names = c("ave_max", "ave", "lepo"), class = "data.frame", row.names = c(NA, -2L))

pokusy

dat.m <- structure(list(ave_max = c(15L, 6L), ave = c(6L, NA), lepo = c(4L, NA)), .Names = c("ave_max", "ave", "lepo"), class = "data.frame", row.names = c(NA, -2L))

# ...
  1. Kód a výstup

    dat.m <- setDT(dat.m)
    

    Chybný výstup

            ave_max      ave      lepo
    1:           15        6         4
    2:            6       NA        NA
    Classes ‘data.table’ and "data.frame":  2 obs. of  3 variables:
    $ ave_max: int  15 6
    $ ave    : int  6 NA
    $ lepo   : int  4 NA
    - attr(*, ".internal.selfref")=<externalptr>
    
  2. Kód a výstup

    dat.m <- as.matrix(dcast(melt(setDT(dat.m), measure.vars = names(dat.m)), variable ~ rowid(variable))[, variable := NULL]);
    dimnames(dat.m) <- list(names(dat.m), NULL);
    

    Chybný výstup

     Error in `:=`(variable, NULL) :
    Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways.
    See help(":=").
    

R: 3,4,0 (zadné porty)
OS: Debian 8.7.

odpovede:

1 pre odpoveď č. 1

OP upravil jeho otázku a dodáva údaje ako data.frame:

dat.df <- structure(list(ave_max = c(15L, 6L), ave = c(6L, NA), lepo = c(4L, NA)),
.Names = c("ave_max", "ave", "lepo"), class = "data.frame",
row.names = c(NA, -2L))

dat.df
#  ave_max ave lepo
#1      15   6    4
#2       6  NA   NA
class(dat.df)
#[1] "data.frame"

Teraz žiada o transformáciu týchto data.frame na maticu, ktorá je podobná matici používanej ako vstupné údaje v túto odpoveď.

To sa dá dosiahnuť použitím data.table:

library(data.table)   # CRAN version 1.10.4 used
# transpose the input data frame, use rowid() to create columns,
# remove a character column to ensure matrix will be of type integer,
# finally, coerce to matrix
dat.m2 <- as.matrix(
data.table::dcast(
data.table::melt(setDT(dat.df), measure.vars = names(dat.df)),
variable ~ rowid(variable)
)[, variable := NULL]
)
# add row names, remove column names
dimnames(dat.m2) <- list(names(dat.df), NULL)

dat.m2
#        [,1] [,2]
#ave_max   15    6
#ave        6   NA
#lepo       4   NA

str(dat.m2)
# int [1:3, 1:2] 15 6 4 6 NA NA
# - attr(*, "dimnames")=List of 2
#  ..$ : chr [1:3] "ave_max" "ave" "lepo"
#  ..$ : NULL

class(dat.m2)
#[1] "matrix"

editovať: Zmenil som vyššie uvedený kód tak, aby používal operátor dvojbodky na explicitné uvedenie priestoru názvov, z ktorého melt() a dcast() treba vziať. Normálne by to nebolo potrebné, pretože data.table je už načítaný. OP však hlási problémy, ktoré môžu byť spôsobené balíkom reshape2 načítava sa po data.table, data.table balík má vlastné rýchlejšie implementácie reshape2::dcast() a reshape2::melt(). Keď sú z nejakého dôvodu načítané oba balíky, môže dôjsť k stretu mien.


1 pre odpoveď č. 2

OP poskytol údaje ako maticu:

dat.m <- structure(c(150L, 60L, 41L, 61L, 0L, 0L), .Dim = c(3L, 2L), .Dimnames = list(
c("ave_max", "ave", "lepo"), NULL))

#    dat.m
#        [,1] [,2]
#ave_max  150   61
#ave       60    0
#lepo      41    0
class(dat.m)
#[1] "matrix"

Pre tento súbor údajov chce OP použiť ggplot2 na vytvorenie stĺpcového grafu s chybovými pruhmi, kde je výška stĺpcov daná hodnotami ave a dolnú a hornú hranicu chybových pruhov o lepo a ave_max, resp., v každom stĺpci.

ako ggplot2 očakáva, že údaje budú dodané ako údaje. v rámci rámca je potrebné údaje transformovať. Pre to, data.table sa používa:

library(data.table)   # CRAN version 1.10.4 used

# convert to data.table & transpose
transposed <- dcast(melt(as.data.table(dat.m, keep.rownames = "Vars"),
id.vars = "Vars"), variable ~ ...)
setnames(transposed, "variable", "Vars")

library(ggplot2)
ggplot(transposed, aes(x = Vars, y = ave, ymin = lepo, ymax = ave_max)) +
geom_col() +
geom_errorbar(width = .25)