【问题标题】:Iteration over 2 lists in R迭代R中的2个列表
【发布时间】:2021-11-12 14:32:45
【问题描述】:

我想用 2 个列表进行迭代。

对于单个案例,我有一个数据框df1 和一个向量v1

我的可重现示例如下。

df1 <- data.frame(n1 = c(2,2,0),
                 n2 = c(2,1,1),
                 n3 = c(0,1,1),
                 n4 = c(0,1,1))

v1 <- c(1,2,3)

现在,我使用此代码为每一行计算一个值 (ses.value)

x <- (v1 - apply(df1, 1, mean))/apply(df1,1,sd)

假设我们将有一个多个数据帧列表l1 和一个向量列表l2(每个列表具有相同数量的元素)现在,我想使用上面的方法为这些列表运行一个循环代码(l1的元素必须与l2的元素同位)。

# 3 dataframes and 3 vectors
df1 <- data.frame(n1 = c(2,2,0), n2 = c(2,1,1), n3 = c(0,1,1), n4 = c(0,1,1))
df2 <- data.frame(n1 = c(1,6,0), n2 = c(2,1,8), n3 = c(0,2,1), n4 = c(0,7,1))
df3 <- data.frame(n1 = c(1,6,0), n2 = c(9,1,5), n3 = c(4,2,1), n4 = c(0,7,2))

v1 <- c(1,2,3)
v2 <- c(2,3,4)
v3 <- c(4,5,6)

# list
l1 <- list(df1,df2,df3)
l2 <- list(v1,v2,v3)

由于我的列表太大,使用for loop 可能不是一个好主意,有什么建议使用lapply 或类似的吗?

【问题讨论】:

    标签: r for-loop lapply


    【解决方案1】:

    我们可以使用Map循环遍历每个list的对应元素,然后根据OP的代码进行计算

    Map(function(x, y) (y - apply(x, 1, mean))/apply(x,1,sd), l1, l2)
    

    -输出

    [[1]]
    [1] 0.0 1.5 4.5
    
    [[2]]
    [1]  1.3055824 -0.3396831  0.4057513
    
    [[3]]
    [1] 0.1237179 0.3396831 1.8516402
    

    另外,如果数据集真的很大,使用collapse中的dapply,效率更高

    library(collapse)
     Map(function(x, y) (y - dapply(x, MARGIN = 1,
         FUN = fmean))/dapply(x, MARGIN = 1, FUN = fsd), l1, l2)
    

    【讨论】:

    • 非常感谢,我想问问l1l2的职位。当我改变它们的位置时,我得到了像Error in apply(x, 1, mean) : dim(X) must have a positive length 这样的错误。你能解释一下吗?
    • @đứcanhlê lambda 函数 x, y 对应于 l1 和 l2i.e。 l1 和 l2 的每个元素,如果你改变位置,x 将是向量,y 将是 data.frame,apply 不适用于向量
    【解决方案2】:

    由于您的列表显然很大,您可能会从 matrixStats 包的 rowMeans2rowSds 中受益。

    library(matrixStats)
    Map(\(x, y) (y - rowMeans2(as.matrix(x))) / rowSds(as.matrix(x)), l1, l2)
    # [[1]]
    # [1] 0.0 1.5 4.5
    # 
    # [[2]]
    # [1]  1.3055824 -0.3396831  0.4057513
    # 
    # [[3]]
    # [1] 0.1237179 0.3396831 1.8516402
    

    数据:

    l1 <- list(structure(list(n1 = c(2, 2, 0), n2 = c(2, 1, 1), n3 = c(0, 
    1, 1), n4 = c(0, 1, 1)), class = "data.frame", row.names = c(NA, 
    -3L)), structure(list(n1 = c(1, 6, 0), n2 = c(2, 1, 8), n3 = c(0, 
    2, 1), n4 = c(0, 7, 1)), class = "data.frame", row.names = c(NA, 
    -3L)), structure(list(n1 = c(1, 6, 0), n2 = c(9, 1, 5), n3 = c(4, 
    2, 1), n4 = c(0, 7, 2)), class = "data.frame", row.names = c(NA, 
    -3L)))
    
    l2 <- list(c(1, 2, 3), c(2, 3, 4), c(4, 5, 6))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-27
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多