Аб'яднанне dataframes ў R на папярэдне адсартаваных калонцы?

Звычайна я працую з вялікім dataframes, якія даволі добра адсартаваных (або могуць быць лёгка адсартаваныя).

Улічваючы два dataframes, як сартуюцца па «карыстальніка»

some.data    
user   

І я бягу т = зліццё (some.data, карыстальнік) , я атрымліваю вынік, як:

m =     

І гэта добра, так.

Але зліццё не скарыстацца гэтым dataframes сартуецца па агульным калонку які чыніць зліцця даволі цяжкі CPU/памяць. Аднак, гэта зліццё можа быць зроблена ў O (N)

Мне цікава, калі ёсць спосаб у R правесці эфектыўнае зліццё адсартаваных набораў дадзеных?

6
Калі я не магу прыдумаць нічога больш істотнага, каб дадаць, адказ Нік з'яўляецца тое, што я рэкамендую. Адзіная рэч, што гэта добра, каб ачысціць ўсе невыкарыстоўваныя або непатрэбныя зменныя пры выкананні зліцця: вы ў канчатковым выніку, каб рухацца вакол, што значна больш дадзеных пры стварэнні новага кадра дадзеных. Я часта ствараюць часовыя зменныя ў кадры дадзеных (або табліцы дадзеных), а затым іх ядзерную зброю (напрыклад, myDT $ tmpVar = NULL ) да зліцця або сартавання аб'ектаў.
дададзена аўтар Iterator, крыніца

2 адказы

У мяне няма ніякага вопыту работы з ім, але, наколькі я ведаю, гэта адно з пытанняў, пакет data.table быў распрацаваны для паляпшэння.

Для большасці практычных мэтаў, data.table = data.frame + Індэкс . Як следства, пры выкарыстанні правільна, гэта павышае прадукцыйнасць досыць некалькіх буйных аперацый.

Існуе небяспека, што ператвараючы ваш data.frame у data.table (г.зн. даданне індэкса) можа заняць некаторы час (хоць я чакаю, што гэта будзе добра аптымізаваны), але як толькі вы атрымалі яго, такія функцыі, як зліццё можа лёгка выкарыстоўваць індэкс для лепшай прадукцыйнасці.

5
дададзена
Гэта добры адказ. Для ўдакладнення: даданне індэкса на самай справе не адбываецца - data.table выкарыстоўвае самі дадзеныя для стварэння ключоў (хоць абмежаваны цэлымі колькасці або лічбы, якія з'яўляюцца цэлымі лікамі, AFAIK). Для таго, каб зрабіць гэта, ён сартуе дадзеныя па паказаным ключу <я> Зменныя . Калі дадзеныя ўжо ў асноўным сартуюцца гэтымі ключамі, то поўны гатунак даволі хутка. Гэта не трэба, аднак, ўказаць ключы - можна па-ранейшаму выкарыстоўваць зліцця .
дададзена аўтар Iterator, крыніца
(Працяг) Па гэтых і іншых прычынах, усе звязаныя з хуткасцю, я нядаўна змяніў мноства кадраў дадзеных у табліцах дадзеных, і не пашкадаваў пра гэта - гэта хутка, і я пратэставаныя яго супраць 10 або каля таго альтэрнатыў. Без гэтага, я буду пісаць шмат кода ў C ці C ++, каб зрабіць толькі частка таго, што я мог бы зрабіць з ім. (Погляд на кучы пытанняў, я адказваў, што зраблю працэс навучання даволі ясна. ;-))
дададзена аўтар Iterator, крыніца

Калі ваш набор агульных ключоў/індэксаў цалкам перакрываюцца, то ёсць ...

Reduce(`&`, user$user.id %in% some.data$user.id)

... вяртае TRUE, і яны, як вы сказалі, сартуюць, <б> і няма дублюе , то ваш зліваючыся задача зводзіцца да дадання слупкоў у data.frame. Нешта ў лініях уздоўж ...

library(log4r)

t1 <- system.time(z <- merge(user, some.data, by='user.id'))

info(my.logger, paste('Elapsed time with merge():', t1['elapsed']))

t2 <- Sys.time()

r <- data.frame(user.id=user$user.id, V1.x=user$V1, V2.x=user$V2)

r[,names(some.data)] <- some.data[,names(some.data)

t3 <- Sys.time()

info(my.logger, paste('Elapsed time without:', t3-t2))

Калі здагадкі вышэй не мае месца, то ён атрымлівае крыху брудней ўсталяваць аб'яднанне абодвух набораў клавіш, функцыя перакладу, NA набіванне), але зліваюцца і перакрыццем здагадкай атрымлівае вас доўгі шлях наперадзе.

Звярніце таксама ўвагу, што тэрміны секунднай падыходы зрушаныя, так як ён тэлефануе двойчы SYS.TIME (), у адрозненні ад зліцця() часу, якое выклікае system.time() і толькі адзін раз. (Прабачце мой кульгавы выкарыстанне С.О. нацэнкі)

0
дададзена