2013-05-07 17 views
6

Czy ktoś wie, jak zachować rownames w funkcji rbind.fill.Zachowaj nazwy wierszy podczas korzystania z pliku rbind.fill w R

library(plyr) 

#creating data 
a <- mtcars[ 1:5 , c("mpg","hp","gear") ] 
b <- mtcars[ 6:10 , c("mpg","disp","gear") ] 

#does not work because there are different colnames 
rbind(a,b) 

#works but eliminates the rownames 
bound <- rbind.fill(a , b) 

jestem utworzenie pętli gdzie obiekty zostaną połączone za pomocą rbind.fill. Teraz używam funkcji łączenia w następujący sposób:

namess <- c(rownames(a) , rownames(b)) 
rownames(bound) <- namess 

Pomyślałem, że może być lepszy sposób. Dzięki!

+0

Uznalbym to za błąd. Nie wiem, czy 'plyr' ma forum/miejsce do zgłaszania błędów, ale jeśli tak, to ktoś powinien do niego linkować, a to powinno zostać przesłane imo. – eddi

+1

@eddi uzgodnione :) Właśnie przedłożyłem go na github https://github.com/hadley/plyr/issues/156 –

+1

Plyr nie obsługuje nazw wierszy. Lepszym pomysłem jest umieszczenie ich w zmiennej, a następnie zajęcie się nimi wyraźnie. – hadley

Odpowiedz

0

Od czasu opublikowania tego pytania pięć lat temu - udostępniono nową funkcję. smartbind rozwiązuje ten problem.

library(gtools) 

#creating data 
a <- mtcars[ 1:5 , c("mpg","hp","gear") ] 
b <- mtcars[ 6:10 , c("mpg","disp","gear") ] 

smartbind(a , b) 
2

można spróbować zastosować funkcję niestandardową, która wykonuje rbind.fill i automatycznie ustawia początkowe rownames tak:

# List of sample data 
ab.list <- list(a <- mtcars[1:5 , c("mpg","hp","gear")], 
       b <- mtcars[6:10 , c("mpg","disp","gear")]) 

# Apply custom function (rbind and rownames adjustment) to sample data 
do.call(function(...) { 

    tmp <- plyr::rbind.fill(...) 
    rownames(tmp) <- sapply(ab.list, function(i) { 
    rownames(i) 
    }) 

    return(tmp) 

}, ab.list) 

        mpg hp gear disp 
Mazda RX4   21.0 110 4 NA 
Mazda RX4 Wag  21.0 110 4 NA 
Datsun 710  22.8 93 4 NA 
Hornet 4 Drive 21.4 110 3 NA 
Hornet Sportabout 18.7 175 3 NA 
Valiant   18.1 NA 3 225.0 
Duster 360  14.3 NA 3 360.0 
Merc 240D   24.4 NA 4 146.7 
Merc 230   22.8 NA 4 140.8 
Merc 280   19.2 NA 4 167.6 

Check out this previous post który zajmuje się podobnym problemem.

+1

Prawdopodobnie lepiej jest wyodrębnić nazwy wierszy najpierw z funkcji, analizując argumenty w '...', zamiast sięgać z powrotem do ramki macierzystej dla nich. – joran

+0

@joran, edytuj :-) – fdetsch

+0

Mam problem z wymyśleniem eleganckiego sposobu radzenia sobie zarówno z przekazywaniem 'ab.list' _and_' ab.list [[1]], ab.list [ [2]] "oddzielnie. – joran