Крайната матрица с данни на R.table

Скорост. Кратък синтаксис. Обратна съвместимост.

Но особено скоростта.

Това са някои от функциите, които правят данните на R таблица завладяваща за своите фенове.

И дори ако сте потвърден потребител на tidyverse (както съм аз), data.table може да бъде полезно допълнение към вашия набор от инструменти R - особено когато работите с големи масиви от данни, в Shiny app или в пакетна функция. 

Този краен мамят на R data.table се различава от много други, защото е интерактивен. Можете да търсите конкретна фраза като добавяне на колона или по тип група задачи, като Подмножество или Промяна на формата . В допълнение, тъй като това мамят лист включва tidyverse "превод" код, можете да търсите и любимо dplyr глагол като мутират или rowwise .

Регистрираните потребители могат да изтеглят разширена версия на тази интерактивна таблица за използване на собствените си системи! Регистрацията е безплатна. 

Търсене в data.table и tidyverse задачи и код

Задача Тип data.table Код Tidyverse код
Прочетете в CSV файл Внос mydt <- fread ("myfile.csv") myt <- read_csv ("myfile.csv") # ИЛИ myt <- vroom :: vroom ("myfile.csv")
Импортирайте първите x броя редове на CSV файл Внос mydt_x <- fread ("myfile.csv", nrows = x) myt_x <- read_csv ("myfile.csv", n_max = x)
Импортирайте само тези редове от CSV файл, които съответстват на определен модел Внос mydt_pattern <- fread ("grep 'mypattern' myfile.csv") myt_pattern <- vroom :: vroom (тръба ("grep 'mypattern' myfile.csv"))
Импортирайте .gz компресиран файл Внос mydt <- fread ("myfile.gz") myt <- vroom :: vroom ("myfile.gz")
Импортирайте компресиран файл.zip внос mydt <- fread (cmd = 'unzip -cq myfile.zip') myt <- read_csv ("myfile.zip")
Създаване на таблица с данни от съществуваща рамка с данни (тибъл за tidyverse) Внос mydt <- as.data.table (mydf) # ИЛИ

setDT (mydf)

myt <- as_tibble (mydf)
Променете data.table на място, без да правите копие Спор всяка функция, която започва с набор като setkey (mydt, mycol) или използвайки оператора: = в скоби не е приложимо
Подредете редове въз основа на множество стойности на колони Спор mydt2 <- mydt [поръчка (colA, -colB)] # ИЛИ

setorder (mydt, colA, -colB)

myt <- подреждане (myt, colA, -colB)
Преименувайте колони Спор набор имена (mydt, old = c ('colA', 'colB'), new = c ('NewColA', 'NewColB')) myt <- преименуване (myt, NewColA = colA, NewColB = colB)
Пренареждане на колони: Преместете някои колони в предната (най-лявата) позиция Спор setcolorder (mydt, c ("colB", "colC")) # colB сега в позиция 1 и colC в позиция 2 myt <- преместване (myt, colB, colC)
Филтрирайте редове за ред номер n Подмножество mydt2 <- mydt [n] myt2 <- slice (myt, n)
Филтър за последния ред Подмножество mydt2 <- mydt [.N] myt2 <- slice (myt, n ())
Филтрирайте редове по състояние Подмножество # В някои случаи setkey (mydt, colA, colB) ще ускори производителността # за логически тестове на colA и colB; същото с други колони

mydt2 <- mydt [логически израз]

myt2 <- филтър (myt, логически израз)
Филтрирайте редове, където colA е равно на string1 или string2 Подмножество mydt2 <- mydt [colA% chin% c ("string1", "string2")] myt2 <- филтър (myt, colA% в% c ("string1", "string2"))
Филтрирайте редове, където colA съвпада с регулярен израз Подмножество mydt2 <- mydt [colA% харесва% "mypattern"] myt2 <- филтър (myt, stringr :: str_detect (colA, "mypattern"))
Филтрирайте редове, където стойностите на colA са между 2 числа Подмножество mydt2 <- mydt [colA% между% c (n1, n2)] myt2 <- филтър (myt, между (colA, n1, n2))
Филтрирайте за първите n реда по групи Подмножество mydt2 <- mydt [, .SD [1: n], от = groupcol] myt2% group_by (groupcol)%>% slice (1: n)
Филтрирайте редове за максимална стойност по групи Подмножество mydt2 <- mydt [, .SD [which.max (valcol)], от = groupcol] myt2% group_by (groupcol)%>% филтър (valcol == max (valcol))
Изберете колона и върнете резултатите като вектор Подмножество myvec <- mydt [, colname] myvec <- изтегляне (myt, colname)
Изберете няколко колони, за да създадете нова data.table (рамка за данни или тибъл за tidyverse) Подмножество mydt2 <- mydt [, списък (colA, colB)] # ИЛИ

mydt2 <- mydt [,. (colA, colB)] # ИЛИ

mydt2 <- mydt [, c ("colA", "colB")]

myt2 <- изберете (myt, colA, colB)
Изберете няколко колони, като използвате променлива, съдържаща имената на колоните Подмножество my_col_names <- c ("colA", "colB")

mydt2 <- mydt [, ..my_col_names] # ИЛИ

mydt2 <- mydt [, my_col_names, with = FALSE]

my_col_names <- c ("colA", "colB")

myt2 <- изберете (myt, all_of (my_col_names))

Изберете няколко колони и преименувайте някои Подмножество mydt2 <- mydt [,. (newname1 = col1, newname2 = col2, col3)] myt2 <- изберете (myt, newname1 = col1, newname2 = col2, col3)
Изключете множество колони Подмножество mydt2 <- mydt [, -c ("colA", "colB")] # ИЛИ

mydt2 <- mydt [,! c ("colA", "colB")] # ИЛИ

my_col_names <- c ("colA", "colB")

mydt2 <- mydt [,! .. my_col_names]

myt2 <- изберете (myt, -c (colA, colB)) # ИЛИ

my_col_names <- c ("colA", "colB")

myt2 <- изберете (myt, - {{my_col_names}})

Премахнете дублиращите се редове въз основа на стойности в множество колони Подмножество mydt2 <- уникален (mydt, от = c ("colA", "colB")) myt2 <- различен (myt, colA, colB, .keep_all = TRUE)
Бройте уникални редове въз основа на множество колони Обобщете уникаленN (mydt, от = c ("colA", "colB")) nrow (различен (myt, colA, colB))
Изпълнете обобщени изчисления на данни Обобщете mydt2 <- mydt [, myfun (colA ...)] myt2% обобщава (ColName = myfun (colA ...))
Изпълнете обобщени изчисления на данни от една група Обобщете mydt2 <- mydt [, myfun (colA ...), от = groupcol] myt2%

group_by (groupcol)%>%

обобщавам (

NewCol = myfun (colA ...)

)

Изпълнете обобщени изчисления на данни от една група и дайте име на нова колона Обобщете mydt2 <- mydt [,. (MyNewCol = myfun (colA ...)), от = groupcol] myt2%

group_by (groupcol)%>%

обобщавам (

NewCol = myfun (colA ...)

)

Изпълнете обобщени изчисления на данни от множество групи Обобщете mydt2 <- mydt [, myfun (colA ...), от =. (groupcol1, groupcol2)] myt2%

group_by (groupcol1, groupcol2)%>%

обобщавам (

NewCol = myfun (colA ...)

)

Изпълнете обобщено изчисление на филтрирани данни от множество групи Обобщете mydt2 <- mydt [израз на филтъра, myfun (colA), от =. (groupcol1, groupcol2)] myt2%

филтър (израз на филтъра)%>%

group_by (groupcol1, groupcol2)%>%

обобщавам (

NewCol = myfun (colA), .groups = "пази"

)

Пребройте броя на редовете по групи Обобщете mydt2 <- mydt [,. N, от = groupcol] # за една група # ИЛИ

mydt2 <- mydt [, .N, от =. (groupcol1, groupcol2)]

myt2 <- count (myt, groupcol) # за една група # ИЛИ

myt2 <- брой (myt, groupcol1, groupcol2)

Обобщете множество колони и върнете резултатите в множество колони Обобщете mydt2 <- mydt [, lapply (.SD, myfun),

.SDcols = c ("colA", "colB")]

myt2%

обобщавам (

през (c (colA, colB), myfun)

)

Обобщете множество колони по групи и върнете резултатите в множество колони Обобщете mydt2 <- mydt [, lapply (.SD, myfun),

.SDcols = c ("colA", "colB"), от = groupcol]

myt2%

group_by (groupcol)%>%

обобщение (през (c (colA, colB), myfun))

Добавете колона Изчисли mydt [, MyNewCol: = myfun (colA)] myt%

мутира (

MyNewCol = myfun (colA)

)

Добавете няколко колони наведнъж Изчисли # използвайте всяка функция или израз

mydt [, `: =` (NewCol1 = myfun (colA), NewCol2 = colB + colC)] # ИЛИ

mydt [, c ("NewCol1", "newCol2"): = списък (myfun (colA), colB + colC)]

myt%

мутира (

MyNewCol1 = myfun (colA),

MyNewCol2 = colB + colC

)

Добавете колона, като използвате текуща и предишна стойност от друга колона, като например намиране на разликата между стойността на датата спрямо предходната дата Изчисли mydt [, Diff: = colA - shift (colA)] myt <- mutate (myt, Diff = colA - lag (colA))
Добавете колона, отнасяща се до предишна стойност на колона от група Изчисли mydt2 <- mydt [, Diff: = colA - shift (colA), от = groupcol] myt2% group_by (groupcol)%>% mutate (Diff = colA - lag (colA))
Добавете колона с идентификационни номера на редове по групи Изчисли mydt [, myid: = 1: .N, от = groupcol] myt% group_by (groupcol)%>% mutate (myid = row_number ())
Добавете колона въз основа на няколко условия, без да използвате множество изрази if else (като CASE на SQL) Изчисли # Нуждае се от data.table версия 1.13 или по-нова

# Харесвам всяко условие на нов ред, но това не е задължително

mydt2 <- mydt [, NewCol: = fcase (

условие1, "Стойност1",

условие2, "Стойност2",

условие3, "Стойност3",

default = "Other" # стойност за всичко останало

)]]

myt2%

мутира (

NewCol = case_when (

условие1 ~ "Стойност1",

условие2 ~ "Стойност2",

условие3 ~ "Стойност3",

ИСТИННО ~ "Друго"

)

)

Добавете колона чрез операция по ред Изчисли mydt [, newcol: = myfun (colB, colC, colD), от = 1: nrow (mydt)]

# или ако colA има всички уникални стойности

mydt [, newcol: = myfun (colB, colC, colD), от = colA]

myt%

rowwise ()%>%

мутира (

newcol = myfun (colB, colC, colD)

)

# или

myt%

rowwise ()%>%

мутира (

#use dplyr изберете синтаксис:

newcol = myfun (c_across (colB: colD))

)

Обединете два набора от данни с повече от една колона; запази всичко в set1, но само съвпадения в set2 Присъединяване mydt <- dt2 [dt1, on = c ("dt2col" = "dt1col")] # ИЛИ

mydt <- сливане (dt1, dt2, by.x = "dt1col", by.y = "dt2col", all.x = TRUE) # ИЛИ

setkey (dt1, "dt1col") setkey (dt2, "dt2col") mydt <- dt2 [dt1]

myt <- left_join (df1, df2, от = c ("df1col" = "df2col"))
Обединете 2 набора от данни от повече от една колона - запазете всички в set1, но само съвпадения в set2 Присъединяване mydt <- сливане (dt1, dt2, by.x = c ("dt1colA", "dt1colB"), by.y = c ("dt2colA", "dt2colB"), all.x = TRUE, all.y = FALSE ) #ИЛИ

setkey (dt1, dt1colA, dt1colB)

setkey (dt2, dt2colA, dt2colB)

mydt <- dt2 [dt1]

myt <- left_join (df1, df2, от = c ("df1colA" = "df2colA", "df1colB" = "df2colB"))
Обединете два набора от данни от една обща колона; пазете само мачове Присъединяване mydt <- обединяване (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2") myt <- inner_join (df1, df2, от = c ("df1col" = "df2col"))
Обединете два набора от данни в една обща колона и запазете всички данни в двата набора, независимо дали има съвпадения или не Присъединяване mydt <- сливане (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2", всички = TRUE) myt <- full_join (df1, df2, от = c ("df1col" = "df2col"))
Комбинирайте два набора от данни, като добавите редове от един до дъното на друг Присъединяване mydt_joined <- rbindlist (списък (mydt, mydt2)) myt_joined <- bind_rows (myt, myt2)
Преобразувайте данните от широко до дълго Преоформяне mydt_long <- стопяване (mydt, measure.vars = c ("col1", "col2", "col3"), variable.name = "NewCategoryColName", value.name = "NewValueColName") myt_long <- pivot_longer (myt, cols = start_with ("col"), names_to = "NewCategoryColName", values_to = "NewValueColName")
Преоформете данните от дълго до широко Преоформяне mydt_wide <- dcast (mydt, id_col1 ~ col1, value.var = "ValueColName") myt_wide <- pivot_wider (myt, names_from = col1, values_from = ValueColName)
Верига на множество изрази Спор mydt [expr1] [expr2] myt%

израз 1%>%

израз2

Експортирайте данни в CSV файл Износ fwrite (mydt, "myfile.csv") write_csv (myt, "myfile.csv")
Добавете редове към съществуващ CSV файл Износ fwrite (mydt2, "myfile.csv", append = TRUE) vroom :: vroom_write (myt2, "myfile.csv", delim = ",", append = TRUE)
Експортирайте данни в компресиран CSV файл Износ fwrite (mydt, "myfile.csv.gz", компресиране = "gzip") vroom :: vroom_write (myt, "myfile2.csv.gz")

Има още много какво да научите за data.table! За някои основи на data.table вижте моето петминутно уводно видео:

И накрая, уебсайтът data.table има много повече информация и съвети, като например използване setkey()и други съвети за индексиране.