2016-06-05 21 views
6

Mi piacerebbe convertire un data.frame in una lista di data.frames per colonna usando le funzioni di base R e mantenendo la prima costante di colonna. Ad esempio, vorrei dividere DF in una lista di tre data.frames, ognuno dei quali include la prima colonna. Cioè, mi piacerebbe finire con la lista chiamata LONG senza dover digitare separatamente ogni elemento della lista. Grazie.R convertire data.frame in lista per colonna

DF <- data.frame(OBS=1:10,HEIGHT=rnorm(10),WEIGHT=rnorm(10),TEMP=rnorm(10)) 
DF 

LONG <- list(HEIGHT = DF[c("OBS", "HEIGHT")], 
      WEIGHT = DF[c("OBS", "WEIGHT")], 
      TEMP = DF[c("OBS", "TEMP" )]) 

LONG 

SHORT <- as.list(DF) 
SHORT 

SPLIT <- split(DF, col(DF)) 

risposta

6

Possiamo scorrere l'names di 'DF' tranne il primo, cbind la prima colonna con il sottoinsieme di 'DF' dal names.

setNames(lapply(names(DF)[-1], function(x) cbind(DF[1], DF[x])), names(DF)[-1]) 

o un'altra opzione sarebbe

Map(cbind, split.default(DF[-1], names(DF)[-1]), OBS=DF[1]) 
+0

Molto cool anche se mi chiedo se c'è un modo per includere i nomi delle liste come il mio esempio LONG fa o se c'è un modo per utilizzare l'as.list o dividere le funzioni. – user1491868

+1

@ user1491868 possiamo usare 'setNames'. appena aggiornato – akrun

+1

@DavidArenburg Dovrebbe funzionare. Grazie per avermelo ricordato. – akrun