2015-10-06 15 views
9

ich folgende verwenden können maximal 2 Spaltendplyr zeilenweise max Reichweite von Spalten mutieren

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

Was ich tun möchte, zurückzukehren ist, dass die maximale über eine Reihe von Spalten zu finden, so habe ich nicht um jeden so zu benennen

Irgendwelche Ideen?

Antwort

16

Statt rowwise(), kann dies mit pmax

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

sein Können wir interp von library(lazyeval) verwenden können, wenn wir die Spaltennamen in einem vector gespeichert verweisen möchten erfolgen.

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

gute idee auf pmax. Irgendeine Idee, wie ich Maximum der 3 Spalten finden kann, indem ich nur auf die Buchstützen referenziere? Ex: Sepal.Width durch Petal.Width? – user2502836

+0

@ user2502836 Der Beitrag wurde aktualisiert. Bitte überprüfen Sie, ob das hilft. – akrun

2

Für einige Spalten der Auswahl ohne ganzen Namen eingeben, wenn dplyr mit ziehe ich select Parameter aus subset Funktion.

können Sie gewünschtes Ergebnis wie folgt erhalten:

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

Ich denke, man kann '' select (2: 4) 'anstelle von' subset (select = 2: 4) '. –

0

Es scheint, wie @ akrun Antwort nur die Fälle Adressen, wenn Sie in dem Namen aller Variablen eingeben können, ob die mutate direkt mit mutate(pmax_value=pmax(var1, var2)) verwenden oder Verwenden der Lazy-Auswertung mit mutate_ und interp über mutate_(interp(~pmax(v1, v2), v1=as.name(var1), v2=as.name(var2)).

Ich kann zwei Möglichkeiten sehen, dies zu tun, wenn Sie die Doppelpunktsyntax Sepal.Length:Petal.Width verwenden möchten oder wenn Sie zufällig einen Vektor mit den Spaltennamen haben.

Die erste ist eleganter. Sie ordentlich die Daten und unter den Werten der maximalen nehmen, wenn gruppiert:

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 

Je härter Art und Weise ist eine interpoliert Formel zu verwenden. Das ist gut, wenn Sie einen Zeichenvektor mit den Namen der Variablen haben, über die zu maxi- mieren ist, oder wenn die Tabelle zu hoch/breit ist, damit sie aufgeräumt werden kann.

# 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 
Verwandte Themen