2012-04-03 9 views
9

Potrzebuję utworzyć element data.frame, który będzie wypełniany po jednym wierszu według wyników pętli for. Ma 45 kolumn: nazwy pięciu z nich są statyczne, ale pozostałe są odczytywane (jako wektor) z zewnętrznego pliku CSV w czasie wykonywania. Szukam czegoś wzdłuż liniiUtwórz element data.frame w R z dynamicznie przypisanymi nazwami kolumn.

goalsMenu <- read.csv("Phase 1 goalsmenu.csv", header = TRUE) 
colHeads <- c("analysis","patient","date",as.vector(goalsMenu$Name),"CR") 
output <- data.frame(colHeads) 

jednak stwarza to data.frame jedna kolumna z nazwą kolumny colHeads.

colHeads <- list("analysis","patient","date",as.vector(goalsMenu$Name),"CR") 

wydaje się krokiem w dobrym kierunku, ale muszę „spłaszczyć” go do tworzenia pożądanej struktury data.frame

można doradzić proszę?

+0

Jaką klasę ma każda kolumna? – mdsumner

Odpowiedz

8

Czy to pomoże?

goalsMenu <- paste("Name", 1:40, sep="") 
output <- as.data.frame(matrix(rep(0, 5 + length(goalsMenu)), nrow=1)) 
names(output) <- c("analysis", "patient", "date", goalsMenu, "CR1", "CR2") 

Zasadniczo utworzyć data.frame output z liczbą kolumn pierwszy i nazwać te kolumny w następnym kroku. Należy jednak pamiętać o komentarzu mdsumner! W ten sposób wszystkie kolumny mają klasę numeric. Później możesz sobie z tym poradzić: change the class of columns in data.frame

+0

Dzięki - to zadziałało (chociaż trzeba najpierw pozbyć się pierwszego rzędu zerowego). Z wyjątkiem (jak można się spodziewać) daty wszystkie kolumny są numeryczne (pierwsze dwa numery referencyjne, reszta wszystkie zmiennoprzecinkowe) –

+0

@RobForsyth Ponieważ powiedziałeś, że przeplatasz wiersze w każdym razie, aby wypełnić dane.frame, I myśl, że musisz zacząć od pierwszego rzędu i zastąpić zera. Powinno to również automatycznie zastąpić klasę kolumny. Czy na to pytanie odpowiadasz? A może szukasz czegoś innego? Jeśli jest to pierwsze, byłoby dobrze, gdybyś mógł przyjąć moją odpowiedź lub Allana, więc ta jest poza listą. W przeciwnym razie byłoby wspaniale, gdybyś mógł podać więcej szczegółów i mógłbym spróbować jeszcze raz ;-) A może ktoś inny ma lepsze rozwiązanie (chyba tak jest). –

+0

przepraszam - nowa etykieta Stackoverflow! Teraz zaznaczono odpowiedź: jeszcze raz dziękuję! –

5

Jeśli możesz najpierw wypełnić ramkę (niektórymi) danymi, możesz po prostu przypisać do nazw(). W przeciwnym razie trzeba będzie zrobić listę pierwszy (a potem przekonwertować do data.frame):

col.names <- LETTERS[1:10] # Example column names 
data <- vector("list", length(col.names)) 
names(data) <- col.names 
print(str(data))   # Inspect the structure 

Nadzieja to pomaga

Powiązane problemy