views:

136

answers:

4

I have input data that contain lines like this:

-0.438185 -0.766791  0.695282
0.759100  0.034400  0.524807

How can I create a data structure in R that looks like this:

[[1]]
  [1] -0.438185 -0.766791  0.695282 
[[2]]
  [1]  0.759100  0.034400  0.524807 
+6  A: 

Use a list:

> 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

Think of it as a map/dictionary/associative array that is being indexed by an integer.

And if you want to take a string like the one above and turn it into a list of vectors:

> 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

I'm using strsplit to split by newlines, then applying strsplit again to each line. The as.numeric is there to cast from strings to numbers and the [[1]]'s are there because strsplit outputs a list, which we don't really want.

StompChicken
+2  A: 

StompChicken is right, just do it with a list. Though I´d like to add a little trick that might help you learning from existing structures:

 dput(dframe) 

outputs some code to create the respective data.frame or vector. Try this with whatever vector, frame or list and you see how it´s been created, e.g.:

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

echos c(1,2,3,4)

ran2
+2  A: 

Supposing your data is in the form of a dataframe named, say, df :

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

gives

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

$`2`
      V1       V2       V3 
0.759100 0.034400 0.524807 
gd047
+3  A: 

If it is read from a file, say data.txt, it can be done this way:

lapply(readLines('data.txt'),function(x) as.numeric(strsplit(x,' +')[[1]]))
mbq
Or just use `read.table`.
Roman Cheplyaka
Especially when number of elements per row differs.
mbq