Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to append an element to a list without keeping track of the index?

Tags:

list

append

r

I am looking for the r equivalent of this simple code in python

mylist = []
for this in that:
  df = 1
  mylist.append(df)

basically just creating an empty list, and then adding the objects created within the loop to it.

I only saw R solutions where one has to specify the index of the new element (say mylist[[i]] <- df), thus requiring to create an index i in the loop.

Is there any simpler way than that to just append after the last element.

like image 879
ℕʘʘḆḽḘ Avatar asked Aug 30 '17 13:08

ℕʘʘḆḽḘ


People also ask

What method will place an additional element in a list at a specific index?

insert() It's useful to add an element at the specified index of the list.

What method is used to add an element at the last index on a list in Python?

append() This function add the element to the end of the list.

Which method is used to add one element to the end of a list?

You can add elements to a list using the append method. The append() method adds a single element towards the end of a list.


2 Answers

There is a function called append:

ans <- list()
for (i in 1992:1994){
n <- 1 #whatever the function is
ans <- append(ans, n)
}

  ans
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 1
## 
## [[3]]
## [1] 1
## 

Note: Using apply functions instead of a for loop is better (not necessarily faster) but it depends on the actual purpose of your loop.

Answering OP's comment: About using ggplot2 and saving plots to a list, something like this would be more efficient:

plotlist <- lapply(seq(2,4), function(i) {
            require(ggplot2)
            dat <- mtcars[mtcars$cyl == 2 * i,]
            ggplot() + geom_point(data = dat ,aes(x=cyl,y=mpg))
})

Thanks to @Wen for sharing Comparison of c() and append() functions:

Concatenation (c) is pretty fast, but append is even faster and therefor preferable when concatenating just two vectors.

like image 175
M-- Avatar answered Oct 19 '22 04:10

M--


mylist <- list()
for (i in 1:100){
  n <- 1
  mylist[[(length(mylist) +1)]] <- n
}

This seems to me the faster solution.

x <- 1:1000

aa <- microbenchmark({xx <- list(); for(i in x) {xx <- append(xx, values = i)} }) 
bb <- microbenchmark({xx <- list(); for(i in x) {xx <- c(xx, i)} } )
cc <- microbenchmark({xx <- list(); for(i in x) {xx[(length(xx) + 1)] <- i} } )

sapply(list(aa, bb, cc), (function(i){ median(i[["time"]]) / 10e5 }))
#{append}=4.466634 #{c}=3.185096 #{this.one}=2.925718
like image 44
Damiano Fantini Avatar answered Oct 19 '22 04:10

Damiano Fantini