2012-04-27 10 views
8

Mam problem z dodaniem jednego do dolnej części innej ramki danych.Dodawanie jednej ramki danych do końca innej ramki danych.frame w R

Mam jedną ramkę danych (nazwijmy ją DF1), która ma 1 wiersz i 5 kolumn. Mam kolejną ramkę danych (pozwala nazwać ją DF2), która ma 50 wierszy i 5 kolumn. Ustawiłem go tak, aby kolumny pomiędzy dwoma ramkami danych pasowały do ​​siebie - mają te same kolumny. W rzeczywistości DF1 jest obliczeniem opartym na DF2.

To co DF1 wygląda następująco:

row.names  pt1  pt2  pt3  pt4 
    calc   0.93 0.45 0.28 0.54 

To co DF2 wygląda następująco:

row.names  pt1  pt2  pt3  pt4 
    SNP1   AA  AG  AG  AA  
    SNP2   CT  CT  TC  CC 
    SNP3   GG  CG  CG  <NA> 
    SNP4   AA  GG  AG  AA 
    SNP5   <NA> <NA> <NA> <NA> 

DF1 ma być liczba rzeczywistych punktów danych (# wartości, które jest nie brakuje) podzielone przez całkowitą liczbę możliwych wartości.

SO .. Chcę dodać DF1 do dołu df2 wyglądać tak:

row.names  pt1  pt2  pt3  pt4 
    SNP1   AA  AG  AG  AA  
    SNP2   CT  CT  TC  CC 
    SNP3   GG  CG  CG  <NA> 
    SNP4   AA  GG  AG  AA 
    SNP5   <NA> <NA> <NA> <NA> 
    calc   0.93 0.45 0.28 0.54 

Kiedy próbowałem za pomocą

both.dfs <- rbind(DF1, DF2) # DF1 is first here 

DF1 to pierwszy wiersz w DF2. POTRZEBUJĘ, że to OSTATNI rząd.

Kiedy próbowałem za pomocą

both.dfs <- rbind(DF2, DF1) # DF2 is first here 

pojawia się błąd:

Warning messages: 
1: In `[<-.factor`(`*tmp*`, iseq, value = 0.84) : 
    invalid factor level, NAs generated 
2: In `[<-.factor`(`*tmp*`, iseq, value = 0.84) : 
    invalid factor level, NAs generated 
3: In `[<-.factor`(`*tmp*`, iseq, value = 0.84) : 
    invalid factor level, NAs generated 
4: In `[<-.factor`(`*tmp*`, iseq, value = 0.74) : 
    invalid factor level, NAs generated 

Próbowałem seryjnej, próbowałem dodać nowy wiersz do df2 a następnie subbing w wartościach DF2 .. nic nie działa! Jestem w rozpaczliwej potrzebie pomocy! Ktoś?

+0

Krótka odpowiedź brzmi: nie możesz (lub przynajmniej powinnam "t). Kolumny ramek danych muszą być wektorem atomowym (to jest ten sam typ danych), a próbujesz mieszać numeryczne (DF1) i znak/czynnik (DF2). – joran

+0

Będzie "działać", jeśli kolumny DF2 są znakami, a nie czynnikami. Ale nadal prawdopodobnie powinieneś znaleźć inny sposób łączenia tych zestawów danych. – joran

Odpowiedz

6

Oto co należy zrobić:

DFtranspose <- cbind(t(DF1[2, ]), t(DF2)) 
rownames(DFtranspose) <- DF1[1, ] 
3

Zgadzam się z komentarzami, że jest to prawdopodobnie zły pomysł, ale oto jak można to zrobić.

Po pierwsze, w oparciu o listę danych data.frame nie będzie się zbyt dobrze łączyć w ten sposób. Jeśli chcesz zmienić dane, lepiej zamień je na macierz. Zauważ, że będziesz musiał wybrać jeden typ dla każdego wiersza w ramce danych, więc nie możesz zachować swoich liczb jako liczb, jeśli są one związane z postaciami. Jeśli jesteś gotów traktować wszystko jako znak, dać to Go:

> df1 <- data.frame(pt1="a", pt2="b", row.names=1) 
> rownames(df1) <- "e" 
> df2 <- data.frame(letters[1:4], pt1=1:4, pt2=2:5, row.names=1) 
> rbind(as.matrix(df2), as.matrix(df1)) 
    pt1 pt2 
a "1" "2" 
b "2" "3" 
c "3" "4" 
d "4" "5" 
e "a" "b"