rbind data.frames bez tytułu


Próbuję dowiedzieć się, dlaczego funkcja
rbind
nie działa zgodnie z oczekiwaniami po podłączeniu do nienazwanych data.frames.
Oto moje testy:
test <- data.frame( id=rep(c("a","b"),each=3),
time=rep(1:3,2),
black=1:6,
white=1:6,
stringsAsFactors=FALSE
)# take some subsets with different names
pt1 <- test[,c(1,2,3)]
pt2 <- test[,c(1,2,4)]# method 1 - rename to same names - works
names(pt2) <- names(pt1)
rbind(pt1,pt2)# method 2 - works - even with duplicate names
names(pt1) <- letters[c(1,1,1)]
names(pt2) <- letters[c(1,1,1)]
rbind(pt1,pt2)# method 3 - works - with a vector of NA's as names
names(pt1) <- rep(NA,ncol(pt1))
names(pt2) <- rep(NA,ncol(pt2))
rbind(pt1,pt2)# method 4 - but... does not work without names at all?
pt1 <- unname(pt1)
pt2 <- unname(pt2)
rbind(pt1,pt2)

Wydaje mi się to trochę dziwne. Czy brakuje mi dobrego powodu, dla którego to nie powinno działać po wyjęciu z pudełka?

edytuj, aby uzyskać więcej informacji

Korzystając z sugestii @ JoshO'Brien, aby
debugować
, mogę zidentyfikować błąd jako występujący w tej części instrukcji
if
rbind.data.frame
funkcja
if (is.null(pi) || is.na(jj <- pi[[j]]))

(wersja online kodu jest tutaj:

http://svn.r-project.org/R/tru ... ame.R
http://svn.r-project.org/R/tru ... ame.R
zaczynając od: „

### tutaj są metody rbind i cbind.

")
Podczas przechodzenia przez program wydaje się, że wartość
pi
nie została ustawiona w tym momencie, więc program próbuje indeksować wbudowaną stałą
pi
jako
pi [[3]]
i zgłasza błędy.
Z tego, co rozumiem, wydaje się, że wewnętrzny obiekt
pi
nie jest ustawiony z powodu tego wcześniejszego wiersza, w którym
clabs
został zainicjowany jako
NULL
:
if (is.null(clabs)) clabs <- names(xi) else { #pi gets set here

Jestem zdezorientowany, próbując to rozgryźć, ale zaktualizuję się, gdy sprawy się połączą.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ponieważ
unname ()
& amp; jawne przypisanie NA jako nagłówków kolumn nie jest identyczne. Jeśli wszystkie nazwy kolumn mają wartość NA, wówczas
rbind ()
jest możliwe. Ponieważ
rbind ()
akceptuje nazwy/nazwy kolumn danych, wyniki nie są zgodne, a zatem
rbind ()
nie działa.
Oto kod, który pomoże Ci zrozumieć, o co mi chodzi:
> c1 <- c(1,2,3)
> c2 <- c('A','B','C')
> df1 <- data.frame(c1,c2)
> df1
c1 c2
1 1 A
2 2 B
3 3 C
> df2 <- data.frame(c1,c2) # df1 & df2 are identical
>
> #Let's perform unname on one data frame &
> #replacement with NA on the other
>
> unname(df1)
NA NA
1 1 A
2 2 B
3 3 C
> tem1 <- names(unname(df1))
> tem1
NULL
>
> #Please note above that the column headers though showing as NA are null
>
> names(df2) <- rep(NA,ncol(df2))
> df2
NA NA
1 1 A
2 2 B
3 3 C
> tem2 <- names(df2)
> tem2
[1] NA NA
>
> #Though unname(df1) & df2 look identical, they aren't
> #Also note difference in tem1 & tem2
>
> identical(unname(df1),df2)
[1] FALSE
>

Mam nadzieję że to pomoże. Nazwy są wyświetlane jako
NA
, ale te dwie operacje są różne.
W związku z tym dwie ramki danych z nagłówkami kolumn zamienionymi na
NA
mogą być „rbound”, ale dwie ramki danych bez żadnych nagłówków kolumn (osiągnięte za pomocą
unname ()
) nie mogą.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się