Különbség a „select” és a „$” K

szavazat
-1

Azt akarom, hogy megértsék a sebesség közötti különbség selectés $a részhalmaza oszlopok R (természetesen elismeri, hogy nem tér vissza pontosan ugyanazokat a dolgokat, hanem mind végre a fogalmi get-me-a-columnművelet). Szeretném megérteni, ha akár a legmegfelelőbb.

Pontosabban, hogy milyen feltételek mellett lenne a következő selectnyilatkozatot gyorsabb, mint a megfelelő $nyilatkozatot?

Szintaxis:

select(df, colName1, colName2, ...)
df$colName
A kérdést 20/10/2018 05:42
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
2

Összefoglalva, akkor érdemes használni dplyr, ha a sebesség a fejlődés, a könnyebb érthetőség és a könnyű karbantartás a legfontosabb.

  • Referenciaértékek alatt azt mutatják, hogy a műveletet hosszabb ideig tart a dplyr, mint bázissal R ekvivalens.
  • dplyr visszatér egy másik (bonyolultabb) objektumot.
  • Base R $és hasonló műveletek gyorsabban lehet végrehajtani, de jön a további kockázatokat (pl részleges megfelelő viselkedés); nehezebb lehet olvasni és / fenntartása; vissza (minimális) vektoros objektum, amely lehet, hogy hiányzik néhány kontextus gazdagsága egy adatkeret.

Ez hozzájárulhat ahhoz is kötekedik ki (ha van szokás, hogy ne néztem forráskódját csomagok), amelyek dplyrcsinál egy csomó munka a motorháztető alatt a cél oszlopokat. Ez is egy igazságtalan teszt óta jutunk vissza különböző dolog, de az OP-k „adj ebben az oszlopban” ops, olvassa el ezzel összefüggésben:

library(dplyr)

microbenchmark::microbenchmark(
  base1 = mtcars$cyl, # returns a vector
  base2 = mtcars[['cyl', exact = TRUE]], # returns a vector
  base2a = mtcars[['cyl', exact = FALSE]], # returns a vector
  base3 = mtcars[,"cyl"], # returns a vector
  base4 = subset(mtcars, select = cyl), # returns a 1 column data frame
  dplyr1 = dplyr::select(mtcars, cyl), # returns a 1 column data frame
  dplyr2 = dplyr::select(mtcars, "cyl"), # returns a 1 column data frame
  dplyr3 = dplyr::pull(mtcars, cyl), # returns a vector
  dplyr4 = dplyr::pull(mtcars, "cyl") # returns a vector
)
## Unit: microseconds
##    expr     min       lq       mean   median        uq      max neval
##   base1   4.682   6.3860    9.23727   7.7125   10.6050   25.397   100
##   base2   4.224   5.9905    9.53136   7.7590   11.1095   27.329   100
##  base2a   3.710   5.5380    7.92479   7.0845   10.1045   16.026   100
##   base3   6.312  10.9935   13.99914  13.1740   16.2715   37.765   100
##   base4  51.084  70.3740   92.03134  76.7350   95.9365  662.395   100
##  dplyr1 698.954 742.9615  978.71306 784.8050 1154.6750 3568.188   100
##  dplyr2 711.925 749.2365 1076.32244 808.9615 1146.1705 7875.388   100
##  dplyr3  64.299  78.3745  126.97205  85.3110  112.1000 2383.731   100
##  dplyr4  63.235  73.0450   99.28021  85.1080  114.8465  263.219   100

De mi van, ha van egy csomó oszlopok:

# Make a wider version of mtcars
do.call(
  cbind.data.frame,
  lapply(1:20, function(i) setNames(mtcars, sprintf("%s_%d", colnames(mtcars), i)))
) -> mtcars_manycols

# I randomly chose to get "cyl_4"
microbenchmark::microbenchmark(
  base1 = mtcars_manycols$cyl_4, # returns a vector
  base2 = mtcars_manycols[['cyl_4', exact = TRUE]], # returns a vector
  base2a = mtcars_manycols[['cyl_4', exact = FALSE]], # returns a vector
  base3 = mtcars_manycols[,"cyl_4"], # returns a vector
  base4 = subset(mtcars_manycols, select = cyl_4), # returns a 1 column data frame
  dplyr1 = dplyr::select(mtcars_manycols, cyl_4), # returns a 1 column data frame
  dplyr2 = dplyr::select(mtcars_manycols, "cyl_4"), # returns a 1 column data frame
  dplyr3 = dplyr::pull(mtcars_manycols, cyl_4), # returns a vector
  dplyr4 = dplyr::pull(mtcars_manycols, "cyl_4") # returns a vector
)
## Unit: microseconds
##    expr      min        lq       mean    median        uq       max neval
##   base1    4.534    6.8535   12.15802    8.7865   13.1775    75.095   100
##   base2    4.150    6.5390   11.59937    9.3005   13.2220    73.332   100
##  base2a    3.904    5.9755   10.73095    7.5820   11.2715    61.687   100
##   base3    6.255   11.5270   16.42439   13.6385   18.6910    70.106   100
##   base4   66.175   89.8560  118.37694   99.6480  122.9650   340.653   100
##  dplyr1 1970.706 2155.4170 3051.18823 2443.1130 3656.1705  9354.698   100
##  dplyr2 1995.165 2169.9520 3191.28939 2554.2680 3765.9420 11550.716   100
##  dplyr3  124.295  142.9535  216.89692  166.7115  209.1550  1138.368   100
##  dplyr4  127.280  150.0575  195.21398  169.5285  209.0480   488.199   100

Egy csomó projektek, dplyra legjobb választás. A végrehajtás sebessége azonban nagyon gyakran nem egy attribútum a „tidyverse”, de a sebesség fejlődését és kifejező általában meghaladják a sebesség különbség.

Megjegyzés: dplyrigék valószínűleg jobb jelölt, mint subset(), és - miközben lustán használni $, ez is egy srác miatt veszélyesnek alapértelmezett részleges megfelelő viselkedés mint [[]]anélkül exact=TRUE. Egy jó szokás (IMO), hogy bekerüljön a beállítás options(warnPartialMatchDollar = TRUE)az összes projekt, ahol nem tudatosan számít ez a viselkedés.

Válaszolt 20/10/2018 12:01
a forrás felhasználó

szavazat
1

Ez nem ugyanaz. Ha keres a funkciók, fontolóra pull () ugyanabból a dplyr csomagot. Dollárjel vissza vektor „építmények” a dataframe húzza ugyanezt teszi.

Válaszolt 20/10/2018 07:36
a forrás felhasználó

szavazat
0

selectvan a dplyr csomag része a tidyverse. https://dplyr.tidyverse.org/

lehet, hogy valami ilyesmit

df %>% 
  select(colName1, colName2)

Amely kiválasztja azokat az oszlopokat df. Ezek a kijelentések vannak írva, mint igék (pl kiválasztásához, intézkedik, group_by, stb), és így sokkal könnyebb dolgozni adatokat.

$jelentése a base r. Ez megmutatja, hogy csak a hozzá tartozó oszlopot df.

Válaszolt 20/10/2018 08:18
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more