2014-10-31 19 views
9

Szukałem obszernie, ale nie znalazłem odpowiedzi na to pytanie w Stack Overflow.Dodaj kolumny do pustej ramki danych w R

Powiedzmy, że mam ramkę danych.

zdefiniować:

a <- NULL 
a <- as.data.frame(a) 

Gdybym chciał dodać kolumnę do tej ramki danych jako tak:

a$col1 <- c(1,2,3) 

pojawia się następujący błąd:

Error in `$<-.data.frame`(`*tmp*`, "a", value = c(1, 2, 3)) : 
    replacement has 3 rows, data has 0 

dlaczego Naprawiono wymiar wiersza, ale kolumna nie jest?

Jak zmienić liczbę wierszy w ramce danych?

Jeśli mogę to zrobić (wprowadzanie danych do listy, a następnie konwersję do df), to działa dobrze:

a <- NULL 
a$col1 <- c(1,2,3) 
a <- as.data.frame(a) 

Odpowiedz

7

Wymiar rząd nie jest ustalona, ​​ale data.frames są przechowywane w formie listy wektorów, które są ograniczone do tej samej długości. Nie można dodać col1 do a, ponieważ col1 ma trzy wartości (wiersze), a a ma zero, tym samym łamiąc ograniczenie. R nie domyślnie automatycznie ożywia wartości przy próbie rozszerzenia wymiaru data.frame przez dodanie kolumny, która jest dłuższa niż data.frame. Powodem, że drugi przykład działa, jest to, że col1 jest jedynym wektorem w data.frame, więc data.frame jest zainicjalizowany trzema wierszami.

Jeżeli chcesz automatycznie mają data.frame poszerzyć, można użyć następujących funkcji:

cbind.all <- function (...) 
{ 
    nm <- list(...) 
    nm <- lapply(nm, as.matrix) 
    n <- max(sapply(nm, nrow)) 
    do.call(cbind, lapply(nm, function(x) rbind(x, matrix(, n - 
     nrow(x), ncol(x))))) 
} 

ten wypełni brakujące wartości z NA. I użyjesz go tak: cbind.all(df, a)

+0

Chyba tak blisko do tego, co zostało już robi. Myślałem, że istnieje mądrzejsze rozwiązanie. Zdaję sobie sprawę, że używałem wektora, a nie dodałem go do ramki danych. Poza tym prawdopodobnie nie opisałem, co miałem na myśli, kiedy użyłem tego słowa. Wymiaru wiersza nie można łatwo zmienić, podobnie jak wymiar kolumny. – Michal

+0

Jest to również ta sama odpowiedź: http://stackoverflow.com/questions/7962267/cbind-a-df-with-an-empty-df-cbind-fill – Michal

1

Można również zrobić coś takiego, w którym czytam dane z wielu plików, chwytam żądaną kolumnę i przechowuję ją w ramce danych. I sprawdzić, czy dataframe ma nic w nim, a jeśli nie, utwórz nową raczej niż uzyskiwanie błąd o niezgodnym Liczba rzędów:

readCounts = data.frame() 

for(f in names(files)){ 
    d = read.table(files[f], header=T, as.is=T) 
    d2 = round(data.frame(d$NumReads)) 
    colnames(d2) = f 
    if(ncol(readCounts) == 0){ 
     readCounts = d2 
     rownames(readCounts) = d$Name 
    } else{ 
     readCounts = cbind(readCounts, d2) 
    } 
} 
Powiązane problemy