2012-09-20 23 views
5

Czy można zmienić domyślny separator, gdy rzutowany (dcast) przydziela nowe nagłówki kolumn?Zmiana domyślnego separatora w obsadzie

jestem konwersji pliku z długo szerokości, a ja się następujące nagłówki:

value_1, value_2, value_3,... 

W przekształcić można przypisać parametr „SEP” (SEP = „”) i wyjście nagłówki kolumn podobnego Chcę im:

value1, value2, value3,... 

jednak przekształcenia zajmuje minut dla mojej ramki danych z ponad 200 tysięcy wierszy, natomiast dcast zajmuje kilka sekund. dcast wyprowadza także kolumny w żądanej kolejności, a nie zmienia kształtu. Czy istnieje jakiś prosty sposób na zmianę wyjścia przy pomocy dcastu, czy też muszę ręcznie zmienić nagłówki kolumn?

Na przykład:

example <- data.frame(id=rep(c(1,2,3,4),4),index=c(rep(1,4),rep(2,4),rep(1,4),rep(2,4)),variable=c(rep("resp",8),rep("conc",8)),value=rnorm(16,5,1)) 
dcast(example,id~variable+index) 

Przykład daje nagłówki kolumn:

conc_1, conc_2, resp_1, resp_2 

chcę nagłówki kolumn czytać:

conc1, conc2, resp1, resp2 

Próbowałem:

dcast(example,id~variable+index,sep="") 

dcast wydaje się zupełnie ignorować sep, ponieważ podanie symbolu również nie powoduje zmiany wyniku.

+0

Proszę dołączyć odtwarzalny przykład. –

+0

@plplourde Dodałem przykład. – dayne

Odpowiedz

3

Nie można, ponieważ ta opcja nie została włączona do dcast. Ale to dość trywialne, aby to zrobić po uruchomieniu dcast.

casted_data <- dcast(example,id~variable+index) 


library(stringr) 
names(casted_data) <- str_replace(names(casted_data), "_", ".") 

> casted_data 
    id conc.1 conc.2 resp.1 resp.2 
1 1 5.554279 5.225686 5.684371 5.093170 
2 2 4.826810 5.484334 5.270886 4.064688 
3 3 5.650187 3.587773 3.881672 3.983080 
4 4 4.327841 4.851891 5.628488 4.305907 

# If you need to do this often, just wrap dcast in a function and 
# change the names before returning the result. 

f <- function(df, ..., sep = ".") { 
    res <- dcast(df, ...) 
    names(res) <- str_replace(names(res), "_", sep) 
    res 
} 

> f(example, id~variable+index, sep = "") 
    id conc1 conc2 resp1 resp2 
1 1 5.554279 5.225686 5.684371 5.093170 
2 2 4.826810 5.484334 5.270886 4.064688 
3 3 5.650187 3.587773 3.881672 3.983080 
4 4 4.327841 4.851891 5.628488 4.305907 
+0

Wiem, że zastępowanie nazw jest łatwe, ale szukałem sposobu na obejście tego, jeśli to możliwe. Mam też inne nagłówki kolumn z podkreśleniem, więc zajęłoby to kilka linii kodu - chociaż nadal byłoby to łatwe. – dayne

+0

To _jest_ na drodze. Można przepisać 'dcast' i funkcje wewnętrzne z' reshape2', ale byłoby to jeszcze więcej pracy i zupełnie niepotrzebne. Zawijanie w funkcję pozostawi ją na tym samym numerze wiersza kodu (tylko 1) – Maiasaura

+0

Dziękuję wam. – dayne

1

Jedną z opcji:

example <- data.frame(example,by=paste(example$variable,example$index,sep="")) 
dcast(example,id~by) 
2

dcast w pakiecie data.table (dev wersja 1.9.5) ma teraz 'SEP' argument.

+0

1.9.5 jest już nieaktualny, a @arekolek powyżej zapewnia bardziej kompletną odpowiedź w tym zakresie – MichaelChirico

2

podstawie information provided by dbetebenner i innego przykładu using data.table for improved dcast functionality, Twój przykład postać:

> library(data.table) 
> dcast(setDT(example), id ~ variable + index, sep="") 
    id conc1 conc2 resp1 resp2 
1: 1 5.113707 5.475527 5.938592 4.149636 
2: 2 4.261278 6.138082 5.277773 5.907054 
3: 3 4.350663 4.292398 6.277582 4.167552 
4: 4 5.993198 6.601669 5.232375 5.037936 

setDT() konwertuje list i data.frames do data.tables przez odniesienie.

Testowano przy użyciu data.table v1.9.6.

Powiązane problemy