2010-07-05 8 views
12

J'ai des données d'entrée qui contiennent des lignes comme celle-ci:Comment créer Vecteur de vecteur dans R

-0.438185 -0.766791 0.695282 
0.759100 0.034400 0.524807 

Comment puis-je créer une structure de données en R qui ressemble à ceci:

[[1]] 
    [1] -0.438185 -0.766791 0.695282 
[[2]] 
    [1] 0.759100 0.034400 0.524807 

Répondre

16

Utilisation une liste:

> x <- list() 
> x[[1]] <- c(-0.438185, -0.766791, 0.695282) 
> x[[2]] <- c(-0.759100, 0.034400, 0.524807) 

> x 
[[1]] 
[1] -0.438185 -0.766791 0.695282 

[[2]] 
[1] -0.759100 0.034400 0.524807 

le considérer comme un tableau de carte/dictionnaire/associatif qui est indexé par un entier.

Et si vous voulez prendre une chaîne comme celle-ci et la transformer en une liste de vecteurs:

> s <- "-0.438185 -0.766791 0.695282\n0.759100 0.034400 0.524807" 
> x <- lapply(strsplit(s, "\n")[[1]], function(x) {as.numeric(strsplit(x, '\\s+')[[1]])}) 
> x 
[[1]] 
[1] -0.438185 -0.766791 0.695282 

[[2]] 
[1] 0.759100 0.034400 0.524807 

J'utilise StrSplit de diviser par sauts de ligne, puis d'appliquer à nouveau StrSplit à chaque ligne. L'as.numeric est là pour passer des chaînes aux nombres et les [[1]] sont là parce que strsplit sort une liste, ce que nous ne voulons pas vraiment.

2

StompChicken a raison, il suffit de le faire avec une liste. Bien que ajoutions Id une petite astuce qui pourrait vous aider à apprendre des structures existantes:

dput(dframe) 

sorties du code pour créer le data.frame respectif ou d'un vecteur. Essayez ceci avec ce vecteur, cadre ou d'une liste et vous voyez comment ESt été créé, par exemple:

x= c(1,2,3,4) 
dput(x) 

c echos (1,2,3,4)

3

Supposant vos données sous la forme d'une trame de données nommé, disons, df:

library(plyr) 
alply(as.matrix(df),1,"[") 

donne

$`1` 
     V1  V2  V3 
-0.438185 -0.766791 0.695282 

$`2` 
     V1  V2  V3 
0.759100 0.034400 0.524807 
3

S'il est lu à partir d'un fichier, par exemple data.txt, il peut se faire de cette façon:

lapply(readLines('data.txt'),function(x) as.numeric(strsplit(x,' +')[[1]])) 
+1

Ou tout simplement utiliser 'read.table'. –

+0

Surtout quand le nombre d'éléments par rangée diffère. – mbq

Questions connexes