Как вызвать разные значения для каждого элемента в списке в R - PullRequest
0 голосов
/ 04 марта 2020

У меня есть список с 29 кадрами данных. Я пытаюсь сделать простое преобразование с ifelse(), которое выглядит примерно так: with(df, ifelse(col1 > x, col1 <- col1-y, col1<-col1+y))

Единственное, чего я не могу получить, так это как это изменить x и y значение, так что для каждого кадра данных в списке используется другое значение.

Вот быстрый воспроизводимый пример того, что я получил до сих пор ... но я хочу вызвать различные значения для x и y из фрейма данных (например, 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 и вся помощь / понимание приветствуется!

Отредактировано для добавления пояснения:

Я бы хотел, чтобы строки совпали со списками.

Например, строка 1 в Info (x = 8,5, y = 1) используется в функции и применяется только к первому фрейму данных в списке (df.1).

1 Ответ

1 голос
/ 04 марта 2020

Когда вам нужно передать более одного значения в lapply, вы должны использовать вместо него mapply.

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
)  

Я оставил некоторую отладку в коде, который можно включить в случае, если вы хотите чтобы увидеть, как это работает.

...