2015-10-06 17 views
9

tôi có thể sử dụng sau đây để trả lại tối đa 2 cộtdplyr đột biến max rowwise của hàng loạt các cột

newiris<-iris %>% 
rowwise() %>% 
mutate(mak=max(Sepal.Width,Petal.Length)) 

Những gì tôi muốn làm là thấy tối đa qua một loạt các cột vì vậy tôi không có để đặt tên cho mỗi người như thế này

newiris<-iris %>% 
rowwise() %>% 
mutate(mak=max(Sepal.Width:Petal.Length)) 

Bất kỳ ý tưởng nào?

Trả lời

16

Thay vì rowwise(), điều này có thể được thực hiện với pmax

iris %>% 
     mutate(mak=pmax(Sepal.Width,Petal.Length, Petal.Width)) 

Có thể chúng ta có thể sử dụng interp từ library(lazyeval) nếu chúng ta muốn tham khảo các tên cột được lưu trữ trong một vector.

library(lazyeval) 
nm1 <- names(iris)[2:4] 
iris %>% 
    mutate_(mak= interp(~pmax(v1), v1= as.name(nm1))) 
+1

ý 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

+0

@ user2502836 Đã cập nhật bài đăng. Vui lòng kiểm tra xem điều đó có hữu ích không. – akrun

2

Đối với việc lựa chọn một số cột mà không cần gõ toàn bộ tên khi sử dụng dplyr tôi thích select tham số từ subset chức năng. Kết quả

Bạn có thể nhận được mong muốn như thế này:

iris %>% subset(select = 2:4) %>% mutate(mak = do.call(pmax, (.))) %>% 
    select(mak) %>% cbind(iris) 
+1

Tôi nghĩ rằng người ta chỉ có thể làm 'select (2: 4)' thay vì 'tập hợp con (select = 2: 4)'. –

0

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_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 
Các vấn đề liên quan