Nó có vẻ như @ câu trả lời akrun của chỉ đề cập đến các trường hợp khi bạn có thể gõ vào tên của tất cả các biến, cho dù đó là sử dụng mutate
trực tiếp với mutate(pmax_value=pmax(var1, var2))
hoặc khi sử dụng đánh giá lười biếng với mutate_
và interp
qua mutate_(interp(~pmax(v1, v2), v1=as.name(var1), v2=as.name(var2))
.
Tôi có thể thấy hai cách để thực hiện việc này nếu bạn muốn sử dụng cú pháp đại tràng Sepal.Length:Petal.Width
hoặc nếu bạn tình cờ có một vectơ có tên cột.
Đầu tiên là thanh lịch hơn. Bạn dọn dẹp dữ liệu và lấy tối đa các giá trị khi được nhóm:
data(iris)
library(dplyr)
library(tidyr)
iris_id = iris %>% mutate(id=1:nrow(.))
iris_id %>%
gather('attribute', 'value', Sepal.Length:Petal.Width) %>%
group_by(id) %>%
summarize(max_attribute=max(value)) %>%
right_join(iris_id, by='id') %>%
head(3)
## # A tibble: 3 × 7
## id max_attribute Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## <int> <dbl> <dbl> <dbl> <dbl> <dbl> <fctr>
## 1 1 5.1 5.1 3.5 1.4 0.2 setosa
## 2 2 4.9 4.9 3.0 1.4 0.2 setosa
## 3 3 4.7 4.7 3.2 1.3 0.2 setosa
Cách khó hơn là sử dụng công thức nội suy. Điều này là tốt nếu bạn có một vector ký tự với tên của các biến được max'ed hơn hoặc nếu bạn bảng là quá cao/rộng cho nó được tidied.
# Make a character vector of the names of the columns we want to take the
# maximum over
target_columns = iris %>% select(-Species) %>% names
## [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
# Make a vector of dummy variables that will take the place of the real
# column names inside the interpolated formula
dummy_vars = sapply(1:length(target_columns), function(i) sprintf('x%i', i))
## [1] "x1" "x2" "x3" "x4"
# Paste those variables together to make the argument of the pmax in the
# interpolated formula
dummy_vars_string = paste0(dummy_vars, collapse=',')
## [1] "x1,x2,x3,x4"
# Make a named list that maps the dummy variable names (e.g., x1) to the
# real variable names (e.g., Sepal.Length)
dummy_vars_list = lapply(target_columns, as.name) %>% setNames(dummy_vars)
## $x1
## Sepal.Length
##
## $x2
## Sepal.Width
##
## $x3
## Petal.Length
##
## $x4
## Petal.Width
# Make a pmax formula using the dummy variables
max_formula = as.formula(paste0(c('~pmax(', dummy_vars_string, ')'), collapse=''))
## ~pmax(x1, x2, x3, x4)
# Interpolate the formula using the named variables
library(lazyeval)
iris %>%
mutate_(max_attribute=interp(max_formula, .values=dummy_vars_list)) %>%
head(3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species max_attribute
## 1 5.1 3.5 1.4 0.2 setosa 5.1
## 2 4.9 3.0 1.4 0.2 setosa 4.9
## 3 4.7 3.2 1.3 0.2 setosa 4.7
ý tưởng hay về pmax. Bất kỳ ý tưởng làm thế nào tôi có thể tìm thấy tối đa của 3 cột bằng cách chỉ tham khảo bookends? ví dụ: Sepal.Width thông qua Petal.Width? – user2502836
@ user2502836 Đã cập nhật bài đăng. Vui lòng kiểm tra xem điều đó có hữu ích không. – akrun