2016-08-25 9 views
5

Mam duży zestaw danych z około 500 000 wierszy. Każda z nich to ciągi. Chciałbym przyciąć wszystkie wiersze do ustalonego rozmiaru.Szybszy sposób przycinania długiego wektora znaków w R

Znalazłem to:

dt$rev <- strtrim(dt$rev, width=max_len) 

Jednak to trwa zbyt długo. Czy jest szybszy sposób?

+3

Jeśli on w 'data.table' dlaczego nie używasz' data.table' [składnia] (https://s3.amazonaws.com/assets.datacamp.com/img/blog/ data + table + cheat + sheet.pdf)? Ponadto, jak długo jest "za długi"? – bouncyball

+0

Właśnie znalazłem to pytanie zamknięte, nie do końca rozumiem dlaczego. Ta społeczność jest coraz gorsza. Tutaj jest dobry artykuł na ten temat [zachowanie] (https://hackernoon.com/the-decline-of-stack-overflow-7cb69faa575d#.2aqn8c7db) –

Odpowiedz

12

Nie ma to nic wspólnego z data.table. Po prostu strtrim() jest dość powolny.

Dopóki operujesz na znakach o pojedynczej szerokości (tzn. Znakach, które nie są na przykład chińskie/japońskie/koreańskie), możesz zamiast tego użyć numeru substr(), który jest znacznie szybszy.

## Make a long character vector with 5 million elements 
x <- rep(state.name, 1e5) 

## Speed comparison 
system.time(substr(x, 1, 3)) 
# user system elapsed 
# 0.43 0.00 0.44 
system.time(strtrim(x, 3)) 
# user system elapsed 
# 44.63 0.03 44.85 

## Confirm that both methods return the same output 
identical(substr(state.name,1,3), strtrim(state.name,3)) 
# [1] TRUE 
+0

To jest niezwykłe. Nie wyglądam na siebie (powinienem), ale zastanawiam się, co to jest, że 'strtrim()' ma? (Świetna odpowiedź.) – Andrie

+4

@Andrie. Tak samo. Byłem również zszokowany. Właśnie teraz zaznaczam '? Strtrim' i zauważam, że" Używanie tej funkcji zamiast "substr" jest ważne, gdy mogą występować znaki podwójnej szerokości (np. Chiński/japoński/koreański) w wektorze znakowym. ", Więc zgadnij, że to jest odpowiedź. Dzięki za podsłuchanie mnie, żeby to sprawdzić. –

+0

Dziękuję, że zadziałało znacznie szybciej !!! –

Powiązane problemy