仅在某些 variables/nested 循环中在 lapply 中使用 sapply
Using sapply within lapply only on certain variables/nested loop
我想分两步解决我的问题,以便我更好地理解编码方式。
第 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 的组合是最好的。
如果您对如何使用嵌套循环执行此操作有想法,那也很有趣。也许第二部分也只适用于嵌套循环...
第一个使用嵌套函数很简单。
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
第一个可以用
完成
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
作为变量名是个坏主意,因为它也是一个常用函数!
我想分两步解决我的问题,以便我更好地理解编码方式。
第 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 的组合是最好的。
如果您对如何使用嵌套循环执行此操作有想法,那也很有趣。也许第二部分也只适用于嵌套循环...
第一个使用嵌套函数很简单。
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
第一个可以用
完成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
作为变量名是个坏主意,因为它也是一个常用函数!