Кращі пакети для роботи з даними в R, частина 2

Є два відмінних пакету для роботи з даними в R —
dplyr
та
data.table
. У кожного пакета свої сильні сторони.
dplyr
елегантніше і схожий на природний мову, в той час як
data.table
лаконічний, з його допомогою багато чого можна зробити лише в один рядок. Більш того, в деяких випадках
data.table
швидше (порівняльний аналіз доступний тут), і це може визначити вибір, якщо є обмеження по пам'яті або продуктивності. Порівняння
dplyr
та
data.table
також можна почитати на Stack Overflow, Quora.

Тут можна знайти керівництво і короткий опис
data.table
, тут
dplyr
. Також можна почитати навчальні матеріали
dplyr
на DataScience+.

першої частини: початок роботи з даними, вибір, вилучення і перейменування стовпців.

Вибрати певні рядки з даних

Щоб вибрати деякі з даних рядка, слід використовувати дієслово
filter
dplyr
разом з умовами, які можуть містити регулярні вирази. В
data.table
потрібні тільки умови.

Фільтрувати за однієї змінної
from_dplyr = filter(hospital_spending,State=='CA') # вибрати рядки для Каліфорнії
from_data_table = hospital_spending_DT[State=='CA']
compare(from_dplyr,from_data_table, allowAll=TRUE)

TRUE
dropped attributes

Фільтрувати за кількома змінним
from_dplyr = filter(hospital_spending,State=='CA' & Claim.Type!="Hospice") 
from_data_table = hospital_spending_DT[State=='CA' & Claim.Type!="Hospice"]
compare(from_dplyr,from_data_table, allowAll=TRUE)

TRUE
dropped attributes

from_dplyr = filter(hospital_spending,State %in% c('CA','MA',"TX")) 
from_data_table = hospital_spending_DT[State %in% c('CA','MA',"TX")]
unique(from_dplyr$State)

CA MA TX

compare(from_dplyr,from_data_table, allowAll=TRUE)

TRUE
dropped attributes

Упорядкувати дані

Щоб упорядкувати рядки, потрібно використовувати дієслово
arrange
на
dplyr
. Це можна зробити за однією чи декількома змінним. Для сортування за спаданням використовують
desc()
, як в прикладах. Приклади сортування за спаданням і зростанням очевидні. Давайте відсортуємо дані по однієї змінної.

За зростанням
from_dplyr = arrange(hospital_spending, State)
from_data_table = setorder(hospital_spending_DT, State)
compare(from_dplyr,from_data_table, allowAll=TRUE)

TRUE
dropped attributes

За спаданням
from_dplyr = arrange(hospital_spending, desc(State))
from_data_table = setorder(hospital_spending_DT, -State)
compare(from_dplyr,from_data_table, allowAll=TRUE)

TRUE
dropped attributes

Сортування по декільком змінним
Давайте упорядкуємо за State за зростанням і End_Date за спаданням.
from_dplyr = arrange(hospital_spending, State,desc(End_Date))
from_data_table = setorder(hospital_spending_DT, State,-End_Date)
compare(from_dplyr,from_data_table, allowAll=TRUE)

TRUE
dropped attributes

Додати/видалити стовпець(ци)

В
dplyr
для додавання стовпців використовується функція
mutate()
. В
data.table
можна додати або змінити стовпець по посиланню, в один рядок, використовуючи
:=
.
from_dplyr = mutate(hospital_spending, diff=Avg.Spending.Per.Episode..State. - Avg.Spending.Per.Episode..Nation.)
from_data_table = copy(hospital_spending_DT)
from_data_table = from_data_table[,diff := Avg.Spending.Per.Episode..State. - Avg.Spending.Per.Episode..Nation.]
compare(from_dplyr,from_data_table, allowAll=TRUE)

TRUE
sorted
renamed rows
dropped row names
dropped attributes

from_dplyr = mutate(hospital_spending, diff1=Avg.Spending.Per.Episode..State. - Avg.Spending.Per.Episode..Nation.,diff2=End_Date-Start_Date)
from_data_table = copy(hospital_spending_DT)
from_data_table = from_data_table[,c("diff1","diff2") := list(Avg.Spending.Per.Episode..State. - Avg.Spending.Per.Episode..Nation.,diff2=End_Date-Start_Date)]
compare(from_dplyr,from_data_table, allowAll=TRUE)

TRUE
dropped attributes

Отримати узагальнену інформацію про стовпцях

Для отримання узагальненої статистики можна використовувати функцію
summarize()
dplyr
.
summarize(hospital_spending,mean=mean(Avg.Spending.Per.Episode..Nation.))

mean 8.772727

hospital_spending_DT[,.(mean=mean(Avg.Spending.Per.Episode..Nation.))]

mean 8.772727

summarize(hospital_spending,mean=mean(Avg.Spending.Per.Episode..Nation.),
maximum=max(Avg.Spending.Per.Episode..Nation.),
minimum=min(Avg.Spending.Per.Episode..Nation.),
median=median(Avg.Spending.Per.Episode..Nation.))

mean maximum minimum median
8.77 19 1 8.5

hospital_spending_DT[,.(mean=mean(Avg.Spending.Per.Episode..Nation.),
maximum=max(Avg.Spending.Per.Episode..Nation.),
minimum=min(Avg.Spending.Per.Episode..Nation.),
median=median(Avg.Spending.Per.Episode..Nation.))]

mean maximum minimum median
8.77 19 1 8.5

Можна також отримати узагальнену статистику по окремих частинах даних. В
dplyr
є функція
group_by()
, а
data.table
просто використовується
by
.
head(hospital_spending_DT[,.(mean=mean(Avg.Spending.Per.Episode..Hospital.)),by=.(Hospital)])


mygroup= group_by(hospital_spending,Hospital) 
from_dplyr = summarize(mygroup,mean=mean(Avg.Spending.Per.Episode..Hospital.))
from_data_table=hospital_spending_DT[,.(mean=mean(Avg.Spending.Per.Episode..Hospital.)), by=.(Hospital)]
compare(from_dplyr,from_data_table, allowAll=TRUE)

TRUE
sorted
renamed rows
dropped row names
dropped attributes

Також можна використовувати більш ніж одне умова угруповання.
head(hospital_spending_DT[,.(mean=mean(Avg.Spending.Per.Episode..Hospital.)),
by=.(Hospital,State)])


mygroup= group_by(hospital_spending,Hospital,State)
from_dplyr = summarize(mygroup,mean=mean(Avg.Spending.Per.Episode..Hospital.))
from_data_table=hospital_spending_DT[,.(mean=mean(Avg.Spending.Per.Episode..Hospital.)), by=.(Hospital,State)]
compare(from_dplyr,from_data_table, allowAll=TRUE)

TRUE
sorted
renamed rows
dropped row names
dropped attributes

Послідовне з'єднання

І
dplyr
та
data.table
дозволяють будувати ланцюжки функцій. В
dplyr
можна використовувати конвеєри з пакету
magrittr
з допомогою
%>%
.
%>%
передає результат однієї функції в якості першого аргументу наступної за нею. В
data.table
для побудови ланцюжків використовують
%>%
або
[
.
from_dplyr=hospital_spending%>%group_by(Hospital,State)%>%summarize(mean=mean(Avg.Spending.Per.Episode..Hospital.))
from_data_table=hospital_spending_DT[,.(mean=mean(Avg.Spending.Per.Episode..Hospital.)), by=.(Hospital,State)]
compare(from_dplyr,from_data_table, allowAll=TRUE)

TRUE
sorted
renamed rows
dropped row names
dropped attributes

hospital_spending%>%group_by(State)%>%summarize(mean=mean(Avg.Spending.Per.Episode..Hospital.))%>%
arrange(desc(mean))%>%head(10)%>%
mutate(State = factor(State,levels = State[order(mean,decreasing =TRUE)]))%>%
ggplot(aes(x=State,y=mean))+geom_bar(stat='identity',color= "darkred',fill='skyblue')+
xlab("")+ggtitle('Average Spending Per Episode by State')+
ylab('Average')+ coord_cartesian(ylim = c(3800, 4000))


Середні витрати на випадок, по штатам

hospital_spending_DT[,.(mean=mean(Avg.Spending.Per.Episode..Hospital.)),
by=.(State)][order(-mean)][1:10]%>% 
mutate(State = factor(State,levels = State[order(mean,decreasing =TRUE)]))%>%
ggplot(aes(x=State,y=mean))+geom_bar(stat='identity',color= "darkred',fill='skyblue')+
xlab("")+ggtitle('Average Spending Per Episode by State')+
ylab('Average')+ coord_cartesian(ylim = c(3800, 4000))


Середні витрати на випадок, по штатам

Висновок

Ми розглянули, як можна здійснювати одні й ті ж операції за допомогою пакетів
data.table
та
dplyr
. Кожен пакет має свої переваги.

Код, що використовується в цій статті, доступний на GitHub.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.