【问题标题】:How to call a different value for each element in a list in R如何为R中列表中的每个元素调用不同的值
【发布时间】:2023-03-12 12:29:01
【问题描述】:

我有一个包含 29 个数据框的列表。 我正在尝试用ifelse() 做一个简单的转换,看起来像这样: with(df, ifelse(col1 > x, col1 <- col1-y, col1<-col1+y))

我似乎无法理解的一件事是如何更改 xy 值,以便为列表中的每个数据框使用不同的值。

这是我到目前为止所获得的快速可复制示例 .. 但我想从数据框(例如 info)中调用不同的 x 和 y 值

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)) })     

感谢所有帮助/见解!

已编辑以添加说明:

我希望行与列表匹配。

例如Info (x=8.5, y=1) 中的第 1 行在函数中使用并仅应用于列表中的第一个数据帧 (df.1)。

【问题讨论】:

    标签: r list apply


    【解决方案1】:

    当您需要向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
    )  
    

    我在代码中留下了一些调试,如果你想看看它是如何工作的,可以启用它。

    【讨论】:

    • 啊,好吧,这是有道理的。跟进,这会产生一个带有结果的数据框..我如何让它把新的输出放在同一个旧的数据框列表中?谢谢!
    • 忽略该评论中的问题,意识到我只需要包含;return(df)
    • &SIMPLIFY = FALSE
    猜你喜欢
    • 2022-01-26
    • 2022-12-22
    • 1970-01-01
    • 2020-05-21
    • 2021-06-18
    • 2015-09-24
    • 2018-12-09
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多