1

I have a list, listDFs, where each element is a data frame. Each data frame has a different number of rows and the same number of columns.

I should create a vector beginning from listDFs[[i]]$Name extracting all the i element from the list.

I thought to use a loop such:

vComposti <- c()
for(j in 1:10){vComposti <- c(listDFs[[j]]$Name)}

But the result is a vector containing only the first level (listDFs[[1]]$Name) of the list.

Where I wrong?? Do you have any suggestion??

joran
  • 169,992
  • 32
  • 429
  • 468
Riccardo
  • 1,885
  • 3
  • 15
  • 22

1 Answers1

6

The problem you have is in this line:

vComposti <- c(listDFs[[j]]$Name)

Each time through your loop, you are re-assigning a new value to vComposti and overwriting the previous value.

In general it is preferable to pre-allocate the vector and fill it element by element:

vComposti <- rep(NA, 10)
for(j in 1:10){
    vComposti[j] <- c(listDFs[[j]]$Name)
}

But it's also not clear to me exactly what you're expecting the result to be. You create a vector, but it looks like you are trying to store an entire data frame column in each element of the vector. If that's the case you may actually be looking for a result that's a list:

vComposti <- vector("list",10)
for(j in 1:10){
    vComposti[[j]] <- c(listDFs[[j]]$Name)
}

Another, somewhat more sophisticated, option may be to use lapply:

lapply(listDFs,FUN = "[","Name")
joran
  • 169,992
  • 32
  • 429
  • 468
  • Yes, `lapply` is the best choice but, the return of `lapply` is a list . How should I do to transform it in a data frame? – Riccardo Nov 19 '11 at 22:08
  • @Riccardo, since a `data.frame` **is** a list, you can simply use `as.data.frame` on the result of `lapply` – Andrie Nov 19 '11 at 22:09
  • I tried it but the R console give this error: _Error in data.frame(list(Name = c("A",: arguments imply differing number of rows: 61, 57, 58, 56, 55, 53, 54, 51, 52, 48_ . – Riccardo Nov 19 '11 at 22:14
  • I solved the last problem with this: `df <-data.frame(matrix(unlist(lComposti),byrow=T))` – Riccardo Nov 19 '11 at 22:35