lwhite3
lwhite3

Reputation: 27

How to call a different value for each element in a list in R

I have a list with 29 data frames. I am trying to do a simple transformation with ifelse(), that looks something like this: with(df, ifelse(col1 > x, col1 <- col1-y, col1<-col1+y))

The one thing I can't seem to get is how to change that x and y value so that a different value is used for each data frame in the list.

Here's a quick reproducible example of what I've got so far .. but I want to call different values for x and y from a data frame (e.g. info)

df.1 <- data.frame("df"=rep(c(1), times=4),"length"=c(10:7))
df.2 <- data.frame("df"=rep(c(2),times=4),"length"=c(8:11))
df.3 <- data.frame("df"=rep(c(3),times=4),"length"=c(9:12))

list <- list(df.1,df.2,df.3)

info <- data.frame(x=rep(c(8.5,9.5,10.5)), y=rep(c(1,1.5,2)))

# using static number for x & y but wanting these to be grabbed from the above df and change 
# for each list

x <- 8
y <- 1
lapply(list, function(df) {
  df <- with(df, ifelse(length > x, 
                            length <- length-y,
                            length <- length+y)) })     

Any and all help/insight is appreciated!

Edited to add clarification:

I would like the rows to match up with lists.

E.g. Row 1 in Info (x=8.5, y=1) is used in the function and applied just to the first data frame in the list (df.1).

Upvotes: 0

Views: 140

Answers (1)

user2332849
user2332849

Reputation: 1450

When you need to pass more than one value to lapply, you must use mapply instead.

mapply(
  function(df, x, y) {
    #print("df")
    #print(df)
    #print("x")
    #print(x)
    #print("y")
    #print(y)
    with(df, ifelse(length > x, length <- length - x, length <- length + y)) 
  },
  list,
  info$x,
  info$y
)  

I've left some debugging in the code which can enabled in case you want to see how it works.

Upvotes: 1

Related Questions