跨列的按行操作
Rowwise operations across columns
很惊讶我以前从未遇到过这个问题...
使用 dplyr 进行跨列操作的正确方法是什么?我想获得在#2 中计算的按行运算。但是,随着操作变得越来越复杂并涉及多个列,这变得不切实际。按照#1 的思路编写更简洁的语法的合适方法是什么?
library(dplyr)
#1
data.frame(a = c(1:5, 6:10),
b = c(6:10, 1:5)) %>%
mutate(MAX_COLUMN = max(a, b))
#2
data.frame(a = c(1:5, 6:10),
b = c(6:10, 1:5)) %>%
mutate(MAX_COLUMN = ifelse(a > b, a, b))
对于通用解决方案添加 rowwise
:
library(dplyr)
data.frame(a = c(1:5, 6:10),
b = c(6:10, 1:5)) %>%
rowwise() %>%
mutate(MAX_COLUMN = max(c_across(a:b)))
# a b MAX_COLUMN
# <int> <int> <int>
# 1 1 6 6
# 2 2 7 7
# 3 3 8 8
# 4 4 9 9
# 5 5 10 10
# 6 6 1 6
# 7 7 2 7
# 8 8 3 8
# 9 9 4 9
#10 10 5 10
如果您想选择最大值,更快的选择是 pmax
和 do.call
。
data.frame(a = c(1:5, 6:10),
b = c(6:10, 1:5)) %>%
mutate(MAX_COLUMN = do.call(pmax, .))
很惊讶我以前从未遇到过这个问题...
使用 dplyr 进行跨列操作的正确方法是什么?我想获得在#2 中计算的按行运算。但是,随着操作变得越来越复杂并涉及多个列,这变得不切实际。按照#1 的思路编写更简洁的语法的合适方法是什么?
library(dplyr)
#1
data.frame(a = c(1:5, 6:10),
b = c(6:10, 1:5)) %>%
mutate(MAX_COLUMN = max(a, b))
#2
data.frame(a = c(1:5, 6:10),
b = c(6:10, 1:5)) %>%
mutate(MAX_COLUMN = ifelse(a > b, a, b))
对于通用解决方案添加 rowwise
:
library(dplyr)
data.frame(a = c(1:5, 6:10),
b = c(6:10, 1:5)) %>%
rowwise() %>%
mutate(MAX_COLUMN = max(c_across(a:b)))
# a b MAX_COLUMN
# <int> <int> <int>
# 1 1 6 6
# 2 2 7 7
# 3 3 8 8
# 4 4 9 9
# 5 5 10 10
# 6 6 1 6
# 7 7 2 7
# 8 8 3 8
# 9 9 4 9
#10 10 5 10
如果您想选择最大值,更快的选择是 pmax
和 do.call
。
data.frame(a = c(1:5, 6:10),
b = c(6:10, 1:5)) %>%
mutate(MAX_COLUMN = do.call(pmax, .))