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))
# ...
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>
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ď č. 1OP 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)