Hello all,
I'm trying to create a 2x2 matrix, 32 times after unlist() so that I can
convert the list to matrix. I've looked through the R archive but
couldn't find the answer. There is what I've done.
> f <- system("ls *.txt", intern=TRUE)
> x <- lapply(f, read.table)
> x
[[1]]
V1 V2
1 -27.3 14.4
2 29.0 -38.1
[[2]]
V1 V2
1 14.4 29.0
2 -38.1 -3.4
[[3]]
V1 V2
1 29.0 -38.1
2 -3.4 55.1
[[4]]
V1 V2
1 -38.1 -3.4
2 55.1 -1.0
[[5]]
V1 V2
1 -3.4 55.1
2 -1.0 21.9
[[6]]
V1 V2
1 55.1 -1.0
2 21.9 -10.9
...
> xx <- unlist(x)
V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
-27.3 29.0 14.4 -38.1 14.4 -38.1 29.0 -3.4 29.0 -3.4 -38.1 55.1
V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
-38.1 55.1 -3.4 -1.0 -3.4 -1.0 55.1 21.9 55.1 21.9 -1.0 -10.9
V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
-1.0 -10.9 21.9 -7.8 21.9 -7.8 -10.9 -48.2 -10.9 -48.2 -7.8 -44.9
V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
-7.8 -44.9 -48.2 -43.8 -48.2 -43.8 -44.9 -10.3 -44.9 -10.3 -43.8 44.2
V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
-43.8 44.2 -10.3 -0.5 -10.3 -0.5 44.2 96.7 44.2 96.7 -0.5 -32.0
V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
-0.5 -32.0 96.7 -0.2 96.7 -0.2 -32.0 -38.6 -32.0 -38.6 -0.2 73.6
V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
-0.2 73.6 -38.6 -17.5 -38.6 -17.5 73.6 -57.8 73.6 -57.8 -17.5 10.7
V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
-17.5 10.7 -57.8 -33.4 -57.8 -33.4 10.7 46.1 10.7 46.1 -33.4 26.7
V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
-33.4 26.7 46.1 -37.3 46.1 -37.3 26.7 1.2 26.7 1.2 -37.3 36.3
V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
-37.3 36.3 1.2 39.6 1.2 39.6 36.3 31.0 36.3 -27.3 39.6 14.4
V11 V12 V21 V22 V11 V12 V21 V22
39.6 29.0 31.0 -38.1 31.0 -3.4 -27.3 55.1
The output should be
[[1]]
[,1] [,2]
[1,] -27.3 14.4
[2,] 29.0 -38.1
[[2]]
[,1] [,2]
[1,] 14.4 29.0
[2,] -38.1 -3.4
[[3]]
[,1] [,2]
[1,] 29.0 -38.1
[2,] -3.4 55.1
...
Thanks and much appreciated!
Muhammad
Hi:
The problem, I'm guessing, is that you need to assign each of the matrices
to an object.
There's undoubtedly a slick apply family solution for this (which I want to
see, BTW!),
but here's the brute force method using a loop:
nms <- paste('x', 1:32, sep = "")
for(i in seq_along(nms)) assign(nms[i], x[[i]])
HTH,
Dennis
On Fri, Jan 29, 2010 at 6:30 AM, Muhammad Rahiz <
muhammad.rahiz@ouce.ox.ac.uk> wrote:
> Hello all,
>
> I'm trying to create a 2x2 matrix, 32 times after unlist() so that I
can
> convert the list to matrix. I've looked through the R archive but
couldn't
> find the answer. There is what I've done.
>
>
> > f <- system("ls *.txt", intern=TRUE)
> > x <- lapply(f, read.table)
> > x
> [[1]]
> V1 V2
> 1 -27.3 14.4
> 2 29.0 -38.1
>
> [[2]]
> V1 V2
> 1 14.4 29.0
> 2 -38.1 -3.4
>
> [[3]]
> V1 V2
> 1 29.0 -38.1
> 2 -3.4 55.1
>
> [[4]]
> V1 V2
> 1 -38.1 -3.4
> 2 55.1 -1.0
>
> [[5]]
> V1 V2
> 1 -3.4 55.1
> 2 -1.0 21.9
>
> [[6]]
> V1 V2
> 1 55.1 -1.0
> 2 21.9 -10.9
>
> ...
>
> > xx <- unlist(x)
> V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
> -27.3 29.0 14.4 -38.1 14.4 -38.1 29.0 -3.4 29.0 -3.4 -38.1 55.1
> V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
> -38.1 55.1 -3.4 -1.0 -3.4 -1.0 55.1 21.9 55.1 21.9 -1.0 -10.9
> V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
> -1.0 -10.9 21.9 -7.8 21.9 -7.8 -10.9 -48.2 -10.9 -48.2 -7.8 -44.9
> V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
> -7.8 -44.9 -48.2 -43.8 -48.2 -43.8 -44.9 -10.3 -44.9 -10.3 -43.8 44.2
> V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
> -43.8 44.2 -10.3 -0.5 -10.3 -0.5 44.2 96.7 44.2 96.7 -0.5 -32.0
> V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
> -0.5 -32.0 96.7 -0.2 96.7 -0.2 -32.0 -38.6 -32.0 -38.6 -0.2 73.6
> V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
> -0.2 73.6 -38.6 -17.5 -38.6 -17.5 73.6 -57.8 73.6 -57.8 -17.5 10.7
> V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
> -17.5 10.7 -57.8 -33.4 -57.8 -33.4 10.7 46.1 10.7 46.1 -33.4 26.7
> V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
> -33.4 26.7 46.1 -37.3 46.1 -37.3 26.7 1.2 26.7 1.2 -37.3 36.3
> V11 V12 V21 V22 V11 V12 V21 V22 V11 V12 V21 V22
> -37.3 36.3 1.2 39.6 1.2 39.6 36.3 31.0 36.3 -27.3 39.6 14.4
> V11 V12 V21 V22 V11 V12 V21 V22
> 39.6 29.0 31.0 -38.1 31.0 -3.4 -27.3 55.1
>
>
> The output should be
>
> [[1]]
> [,1] [,2]
> [1,] -27.3 14.4
> [2,] 29.0 -38.1
>
> [[2]]
> [,1] [,2]
> [1,] 14.4 29.0
> [2,] -38.1 -3.4
>
> [[3]]
> [,1] [,2]
> [1,] 29.0 -38.1
> [2,] -3.4 55.1
>
> ...
> Thanks and much appreciated!
>
>
>
> Muhammad
>
> ______________________________________________
> R-help@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
[[alternative HTML version deleted]]
Hello all,
Thanks for all your replies.
Usually, when I make a post to the R-mailing list, I would keep on
trying to get the solution myself rather than waiting for one. At times,
I was able to derive my own solution. This would explain why my solution
and that of Dennis's produces the same result - not that I totally
ignore the method of his...
Anyway, I did manage to create the matrix I require. But there is still
the recurring problem of " (list) object cannot be coerced to type
'double' " in further analysis using the dataset. I thought I
could
resolve it by changing converting to matrix. Seems not.
Given, the following, is there any other way I can define y other that
using list()? Seems that producing a list of matrices does not work.
y <-
for (i in 1:32){
y[[i]] <- matrix(xx[c(1:4)],2,2)
}
Muhammad
Dennis Murphy wrote:> Correct me if I'm wrong, but isn't this the solution I gave??
>
> On Fri, Jan 29, 2010 at 9:43 AM, Muhammad Rahiz
> <muhammad.rahiz at ouce.ox.ac.uk <mailto:muhammad.rahiz at
ouce.ox.ac.uk>>
> wrote:
>
> Thanks David & Dennis,
>
> I may have found something.
>
> Given that the object xx is the product of unlist(x), to create a
> 2x2 matrix with subsets, I could do,
>
> > y <- matrix(xx[c(1:4)], 2, 2).
>
> First object named y...
>
>
> This returns,
>
>
> [,1] [,2]
> [1,] -27.3 14.4
> [2,] 29.0 -38.1
>
> If I do,
>
> > y2 <- matrix(xx[c(5:8)],2,2)
>
>
> second object named y2
>
> it returns,
>
>
> [,1] [,2]
> [1,] 14.4 29.0
> [2,] -38.1 -3.4
>
>
> And I presume you want to do the same with the remaining 30 matrices,
> assigning them to different objects. That is *precisely* what my solution
> provided. Run it, observe the results and tell me what it is that
> differs from
> what you want, because I don't see it.
>
> Dennis
>
>
> The results are exactly what I want to achieve.
>
> The question is, how can I incorporate the increment in a for loop
> so that it becomes
>
> c(1:4)
> c(5:8)
> c(9:12) and so on
>
> How should I modify this code?
>
> y <- # typeof ? for (i in 1:32){
> y[[i]] <- matrix(xx[c(1:4)],2,2)
> }
>
>
> Muhammad
>
>
> David Winsemius wrote:
>
> On Jan 29, 2010, at 9:45 AM, Dennis Murphy wrote:
>
>
>
> Hi:
>
> The problem, I'm guessing, is that you need to assign each
> of the matrices
> to an object.
> There's undoubtedly a slick apply family solution for this
> (which I want to
> see, BTW!),
>
>
>
> I don't have a method that would assign names but you could
> populate an array of sufficient size and dimension. I
> populated a three-element list with his data:
>
> > dput(x)
> list(structure(list(V1 = c(-27.3, 29), V2 = c(14.4, -38.1)),
> .Names = c("V1",
> "V2"), class = "data.frame", row.names =
c("1", "2")),
> structure(list(
> V1 = c(14.4, -38.1), V2 = c(29, -3.4)), .Names =
c("V1",
> "V2"), class = "data.frame", row.names =
c("1", "2")),
> structure(list(
> V1 = c(29, -3.4), V2 = c(-38.1, 55.1)), .Names =
c("V1",
> "V2"), class = "data.frame", row.names =
c("1", "2")))
>
> > xx <- array( , dim=c(2,2,3))
>
> > xx[,,1:3] <- sapply(x, data.matrix)
> > xx
> , , 1
>
> [,1] [,2]
> [1,] -27.3 14.4
> [2,] 29.0 -38.1
>
> , , 2
>
> [,1] [,2]
> [1,] 14.4 29.0
> [2,] -38.1 -3.4
>
> , , 3
>
> [,1] [,2]
> [1,] 29.0 -38.1
> [2,] -3.4 55.1
>
> Without the more complex structure ready to accept the 2x2
> arrays I got this:
>
> > sapply(x, data.matrix)
> [,1] [,2] [,3]
> [1,] -27.3 14.4 29.0
> [2,] 29.0 -38.1 -3.4
> [3,] 14.4 29.0 -38.1
> [4,] -38.1 -3.4 55.1
>
>
>
>