2016-06-04 7 views
5

Przeglądałem samouczki i dokumentację, ale nie miałem pojęcia, jak przypisać wektor wartości dla wszystkich kolumn do jednego istniejącego wiersza w data.table.Przypisanie wektora do określonego istniejącego wiersza tabeli danych w R

zacznę z pustym data.table który ma już odpowiednią liczbę kolumn i wierszy:

dt <- data.table(matrix(nrow=10, ncol=5)) 

Teraz obliczyć pewne wartości dla jednego rzędu poza data.table i umieścić je w wektorze vec, e. g .:

vec <- rnorm(5) 

Jak mogę przypisać wartości vec do e. sol. pierwszy wiersz data.table przy zachowaniu dobrej wydajności (ponieważ chcę też wypełnić pozostałe rzędy krok po kroku)?

+0

Ponieważ używasz 'data.table' dla celów wydajności (jak stwierdzono w komentarzu do jednej odpowiedzi poniżej) myślę, że dodawanie (wielu) wierszy raz za razem jest ** nie ** w ogóle skuteczne, ponieważ' data.table' (jak 'data.frame') jest sklep kolumna, a nie sklep rząd (czyli po dodaniu wiersza muszą być dostępne różne lokalizacje w pamięci). Jaki jest powód (algorytm), który wymaga dodania wierszy? –

+0

Tworzę bardzo duży pusty stół (11 tysięcy wierszy x 8 tys kolumny), a ja wtedy robi niektóre obliczenia stworzyć wektor że następnie użyć, aby wypełnić tę tabelę w wiersz po wierszu. Myślałem, że użycie data.table może uczynić to szybszym, niż gdybym użył macierzy lub ramki danych. – Pascal

+0

OK, myślę, że 'data.table' jest szybsza używając go w ten sposób od czasu przydzielenia wymaganej pamięci (Tabela rozmiarów) i zastąpić wiersze przez odniesienie (jeśli używasz odpowiedź Richard z' ': = operator), gdyż to rozwiązanie NIE kopiuje całości danych tylko dlatego, że modyfikujesz jedną wartość. Czy mogę edytować pytanie, aby wyjaśnić dokładny przypadek użycia? –

Odpowiedz

8

Najpierw trzeba uzyskać poprawne typy kolumn, jak NA utworzeniu macierzy jest logiczne. Typy kolumn nie zostaną magicznie zmienione poprzez przypisanie im wartości.

dt[, names(dt) := lapply(.SD, as.numeric)] 

Następnie można zmienić wartości w pierwszym rzędzie z

dt[1, names(dt) := as.list(vec)] 

powiedział, że jeśli zaczniesz z matrycą numerycznej nie musiałby zmienić typy kolumn.

dt <- data.table(matrix(numeric(), 10, 5)) 
dt[1, names(dt) := as.list(vec)]