Próbuję zainicjować ramkę data.frame bez żadnych wierszy. Zasadniczo chcę określić typy danych dla każdej kolumny i nazwać je, ale nie chcę tworzyć żadnych wierszy.
Do tej pory najlepsze, co udało mi się zrobić, to:
df <- data.frame(Date=as.Date("01/01/2000", format="%m/%d/%Y"),
File="", User="", stringsAsFactors=FALSE)
df <- df[-1,]
Który tworzy ramkę danych z pojedynczym wierszem zawierającym wszystkie typy danych i nazwy kolumn, które chciałem, ale także tworzy bezużyteczny wiersz, który następnie należy usunąć.
Czy jest na to lepszy sposób?
data.frame
mają wpisane kolumny, więc tak, jeśli chcesz zainicjowaćdata.frame
, musisz zdecydować o typie kolumn ...data.frame
naprawdę nie jest tak naprawdę ograniczający „prymitywność” typów kolumn (na przykład możesz dodać kolumnę dat lub nawet kolumnę zawierającą listę elementów). To pytanie nie jest również bezwzględnym odniesieniem, ponieważ na przykład, jeśli nie określisz poprawnego typu kolumny, nie zablokujesz dalszego dodawania wiersza z kolumną różnych typów ... więc dodam notatkę, ale nie przykład wszystkich prymitywnych typów, ponieważ nie obejmuje wszystkich możliwości ...data.frame(Doubles=rep(as.double(NA),numberOfRow), Ints=rep(as.integer(NA),numberOfRow))
Jeśli masz już istniejącą ramkę danych , powiedzmy,
df
że ma żądane kolumny, możesz po prostu utworzyć pustą ramkę danych, usuwając wszystkie wiersze:Zauważ, że
df
nadal zawiera dane, aleempty_df
ich nie zawiera.Znalazłem to pytanie, szukając sposobu utworzenia nowej instancji z pustymi wierszami, więc myślę, że może być pomocne dla niektórych osób.
źródło
df[NA,]
, wpłynie również na indeks (co raczej nie będzie tym, czego chcesz), zamiast tego użyłbymdf[TRUE,] = NA
; zauważ jednak, że spowoduje to zastąpienie oryginału. Najpierw musisz skopiować ramkę danych,copy_df = data.frame(df)
a następniecopy_df[TRUE,] = NA
empty_df
pomocąempty_df[0:nrow(df),] <- NA
.Możesz to zrobić bez określania typów kolumn
źródło
Możesz użyć
read.table
pustego łańcucha wejściowegotext
w następujący sposób:Alternatywnie, określając
col.names
jako ciąg:Dzięki Richardowi Scrivenowi za poprawę
źródło
read.table(text = "", ...)
nie musisz jawnie otwierać połączenia.read.csv
Podejście działa równieżreadr::read_csv
, podobnie jak wread_csv("Date,File,User\n", col_types = "Dcc")
. W ten sposób możesz bezpośrednio utworzyć pustą tabliczkę o wymaganej strukturze.Najskuteczniejszym sposobem na to jest
structure
utworzenie listy zawierającej klasę"data.frame"
:Aby umieścić to w perspektywie w porównaniu z obecnie akceptowaną odpowiedzią, oto prosty punkt odniesienia:
źródło
data.table
zawiera zwykle.internal.selfref
atrybut, którego nie można sfałszować bez wywołaniadata.table
funkcji. Czy na pewno nie polegasz na nieudokumentowanym zachowaniu?data.table
i zakładając, że Google znalazł to, czego chciałem i wszystko tutaj jestdata.table
powiązane.data.frame()
zapewnia kontrolę nad nazwami, nazwami itp.Po prostu zadeklaruj
próba przejścia do
rbind
pierwszego wiersza spowoduje utworzenie kolumnźródło
rbind
to zadziałałoby dobrze, jeśli nie ...rbind()
.Jeśli szukasz krótkości:
więc nie trzeba osobno określać nazw kolumn. Otrzymasz logiczny domyślny typ kolumny, dopóki nie wypełnisz ramki danych.
źródło
Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 2
Utworzyłem pustą ramkę danych za pomocą następującego kodu
i próbował powiązać niektóre wiersze, aby wypełnić to samo, co następuje.
ale zaczął nadawać niepoprawne nazwy kolumn w następujący sposób
Rozwiązaniem tego jest konwersja newrow na typ df w następujący sposób
teraz wyświetla poprawną ramkę danych, gdy jest wyświetlana z następującymi nazwami kolumn
źródło
Aby utworzyć pustą ramkę danych , wprowadź wymaganą liczbę wierszy i kolumn do następującej funkcji:
Aby utworzyć pustą ramkę , określając klasę każdej kolumny , wystarczy przekazać wektor pożądanych typów danych do następującej funkcji:
Użyj w następujący sposób:
Co daje:
Aby potwierdzić wybór, uruchom następujące polecenie:
źródło
Jeśli chcesz utworzyć pustą ramkę danych z dynamicznymi nazwami (nazwy zmiennych w zmiennej), może to pomóc:
Możesz także zmienić typy, jeśli potrzebujesz. lubić:
źródło
Jeśli nie masz nic przeciwko jawnemu określaniu typów danych, możesz to zrobić w ten sposób:
źródło
Za pomocą
data.table
możemy określić typy danych dla każdej kolumny.źródło
Jeśli chcesz zadeklarować taką
data.frame
liczbę kolumn, prawdopodobnie trudno będzie ręcznie wpisać wszystkie klasy kolumn. Zwłaszcza jeśli możesz skorzystać zrep
tej metody, jest to łatwe i szybkie (około 15% szybsze niż inne rozwiązanie, które można uogólnić w ten sposób):Jeśli żądane klasy kolumn są w wektorze
colClasses
, możesz wykonać następujące czynności:lapply
spowoduje utworzenie listy pożądanej długości, której każdy element jest po prostu pustym wektorem wektorowym, takim jaknumeric()
lubinteger()
.setDF
konwertuje tolist
przez odniesienie dodata.frame
.setnames
dodaje żądane nazwy przez odniesienie.Porównanie prędkości:
Jest także szybszy niż używanie
structure
w podobny sposób:źródło
Załóżmy, że nazwy kolumn są dynamiczne, możesz utworzyć pustą macierz o nazwie wiersza i przekształcić ją w ramkę danych.
źródło
To pytanie nie dotyczyło w szczególności moich obaw ( tutaj nakreślonych ), ale na wypadek, gdyby ktoś chciał to zrobić ze sparametryzowaną liczbą kolumn i bez przymusu:
Jak stwierdza divibisan w powiązanym pytaniu,
źródło
Jeśli masz już ramkę danych, możesz wyodrębnić metadane (nazwy i typy kolumn) z ramki danych (np. Jeśli kontrolujesz BŁĄD, który jest wyzwalany tylko z pewnymi danymi wejściowymi i potrzebujesz pustej obojętnej ramki danych):
A następnie użyj
read.table
do utworzenia pustej ramki danychźródło