在 R 中跨多个数据帧的每个单元格中查找最大值
Find max value in each cell across multiple data frames in R
我正在尝试获取三个不同数据集中每个单元格的最大值。作为玩具示例,想象一下这三个数据框:
set.seed(123)
a <- data.frame(matrix(sample(20,10), ncol = 5, nrow = 5))
b <- data.frame(matrix(sample(20,10), ncol = 5, nrow = 5))
c <- data.frame(matrix(sample(20,10), ncol = 5, nrow = 5))
> a
X1 X2 X3 X4 X5
1 15 2 15 2 15
2 19 6 19 6 19
3 14 11 14 11 14
4 3 5 3 5 3
5 10 4 10 4 10
> b
X1 X2 X3 X4 X5
1 14 10 14 10 14
2 5 7 5 7 5
3 9 15 9 15 9
4 3 18 3 18 3
5 8 17 8 17 8
> c
X1 X2 X3 X4 X5
1 4 5 4 5 4
2 14 12 14 12 14
3 17 10 17 10 17
4 11 16 11 16 11
5 7 9 7 9 7
我想获得一个相同维度的新数据框,其中每个单元格的最大值跨越 a
、b
和 c
。例如,新数据帧的单元格 [1,1]
应具有值 15
(来自 df a
)。我设法通过跨列循环并获得最大值来做到这一点,但速度相当慢。
您可以使用 pmax
:
pmax(a, b, c)
#OR
Reduce(pmax, list(a, b, c))
# X1 X2 X3 X4 X5
#1 15 10 15 10 15
#2 19 12 19 12 19
#3 17 15 17 15 17
#4 11 18 11 18 11
#5 10 17 10 17 10
这里有一些其他选项,但不如
的 pmax
简洁
rowMaxs
和 Map
> library(matrixStats)
> list2DF(Map(function(...) rowMaxs(cbind(...)),a,b,c))
X1 X2 X3 X4 X5
1 15 10 15 10 15
2 19 12 19 12 19
3 17 15 17 15 17
4 11 18 11 18 11
5 10 17 10 17 10
array
> lst <- list(a,b,c)
> data.frame(apply(array(unlist(lst),c(dim(lst[[1]]),length(lst))),1:2,max))
X1 X2 X3 X4 X5
1 15 10 15 10 15
2 19 12 19 12 19
3 17 15 17 15 17
4 11 18 11 18 11
5 10 17 10 17 10
我们也可以用do.call
do.call(pmax, list(a, b, c))
我正在尝试获取三个不同数据集中每个单元格的最大值。作为玩具示例,想象一下这三个数据框:
set.seed(123)
a <- data.frame(matrix(sample(20,10), ncol = 5, nrow = 5))
b <- data.frame(matrix(sample(20,10), ncol = 5, nrow = 5))
c <- data.frame(matrix(sample(20,10), ncol = 5, nrow = 5))
> a
X1 X2 X3 X4 X5
1 15 2 15 2 15
2 19 6 19 6 19
3 14 11 14 11 14
4 3 5 3 5 3
5 10 4 10 4 10
> b
X1 X2 X3 X4 X5
1 14 10 14 10 14
2 5 7 5 7 5
3 9 15 9 15 9
4 3 18 3 18 3
5 8 17 8 17 8
> c
X1 X2 X3 X4 X5
1 4 5 4 5 4
2 14 12 14 12 14
3 17 10 17 10 17
4 11 16 11 16 11
5 7 9 7 9 7
我想获得一个相同维度的新数据框,其中每个单元格的最大值跨越 a
、b
和 c
。例如,新数据帧的单元格 [1,1]
应具有值 15
(来自 df a
)。我设法通过跨列循环并获得最大值来做到这一点,但速度相当慢。
您可以使用 pmax
:
pmax(a, b, c)
#OR
Reduce(pmax, list(a, b, c))
# X1 X2 X3 X4 X5
#1 15 10 15 10 15
#2 19 12 19 12 19
#3 17 15 17 15 17
#4 11 18 11 18 11
#5 10 17 10 17 10
这里有一些其他选项,但不如
pmax
简洁
rowMaxs
和Map
> library(matrixStats)
> list2DF(Map(function(...) rowMaxs(cbind(...)),a,b,c))
X1 X2 X3 X4 X5
1 15 10 15 10 15
2 19 12 19 12 19
3 17 15 17 15 17
4 11 18 11 18 11
5 10 17 10 17 10
array
> lst <- list(a,b,c)
> data.frame(apply(array(unlist(lst),c(dim(lst[[1]]),length(lst))),1:2,max))
X1 X2 X3 X4 X5
1 15 10 15 10 15
2 19 12 19 12 19
3 17 15 17 15 17
4 11 18 11 18 11
5 10 17 10 17 10
我们也可以用do.call
do.call(pmax, list(a, b, c))