【问题标题】:Using sapply within lapply only on certain variables/nested loop仅在某些变量/嵌套循环上在 lapply 中使用 sapply
【发布时间】:2018-05-21 17:48:00
【问题描述】:

我想分两步解决我的问题,以便我更好地理解编码方式。

第 1 部分:

假设我有一个这样的列表:

x <- data.frame(replicate(5,sample(0:100,10,rep=TRUE)))

y <- data.frame(replicate(5,sample(0:100,10,rep=TRUE)))

z <- list(x, y)

我想获取每个列表的每一列的数字范围。 我真的不明白如何将 lapply 与 sapply 结合起来以获得列表中数据框每一列的结果。关于如何做到这一点的任何想法?

如果我想获得第一个列表元素的第三列的范围,我可以正常运行:

range(z[[1]][[2]])

第 2 部分:

我的问题的第二部分更进一步。这次我将在我的数据框中添加一个包含字符的列。

a <- data.frame(replicate(5,sample(0:100,10,rep=TRUE)))
a$x6 <- letters[1:10]

b <- data.frame(replicate(5,sample(0:100,10,rep=TRUE)))
b$x6 <- letters[1:10] 

c <- list(x, y)

我想获取每个列表的每一列的数字范围,但第 6 列除外,它不是数字。我不想删除此列,而只想查询数字列。

关于如何有效地做到这一点的任何想法?我认为 lapply 和 sapply 的组合是最好的。

如果您对如何使用嵌套循环执行此操作有一个想法,那也很有趣。也许第二部分也只适用于嵌套循环......

【问题讨论】:

    标签: r nested-loops lapply sapply


    【解决方案1】:

    第一个可以用

    lapply(z, function(a) sapply(a,range))
    
    [[1]]
         X1 X2 X3 X4 X5
    [1,]  2 13 28  2  3
    [2,] 95 97 98 99 85
    
    [[2]]
         X1 X2 X3 X4  X5
    [1,]  7  4 16  5  19
    [2,] 90 90 82 84 100
    

    第二个可以用

    lapply(c, function(a) sapply(a[sapply(a,is.numeric)],range))
    
    [[1]]
         X1 X2 X3 X4 X5
    [1,]  7  5  0  3  8
    [2,] 97 81 96 93 94
    
    [[2]]
         X1 X2  X3 X4 X5
    [1,]  8  4   0  9  7
    [2,] 72 90 100 99 94
    

    其中的内部sapply 创建了c 的每个元素的列索引的逻辑向量,它们是数字,因此它将字符列排除在循环之外。

    顺便说一句,在R中使用c作为变量名是个坏主意,因为它也是一个常用函数!

    【讨论】:

    • 非常感谢,也感谢您的解释!这对我来说效果很好! :-)
    【解决方案2】:

    第一个使用嵌套函数很简单。

    lapply(z, function(d) { sapply(d, range) })
    [[1]]
         X1 X2 X3 X4  X5
    [1,]  7  0  1  0   1
    [2,] 86 82 96 91 100
    
    [[2]]
         X1 X2 X3 X4 X5
    [1,]  6  0  3 14  1
    [2,] 98 84 99 89 73
    

    其次,嵌套函数开始变得有点难看:

    > lapply(z, function(d) {
       sapply(d, function(col) {
        if (is.numeric(col)) { range(col) } else { c(NA, NA) }
       })
      })
    [[1]]
         X1 X2 X3 X4 X5 x6
    [1,]  8  0  3 12  0 NA
    [2,] 93 97 92 97 97 NA
    
    [[2]]
         X1  X2 X3 X4 X5 x6
    [1,] 20  31 10  5 17 NA
    [2,] 84 100 88 94 99 NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-26
      • 2021-02-05
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      相关资源
      最近更新 更多