2017-11-21 5 views
1

Ich versuche eine Kombination von mutate_at und which.max zu verwenden, um einen Datenrahmen wie unten beschrieben zu manipulieren.Verwenden von mutate_at und which.max für ausgewählte Spalten eines Datenrahmens

#This is basically what I want to achieve 
df_want <- iris %>% group_by(Species) %>% mutate(Sepal.Length = Sepal.Length[which.max(Petal.Width)], 
             Sepal.Width = Sepal.Width[which.max(Petal.Width)]) 

#Here is my attempt at a smarter solution, but it does not work 
df_attempt <- iris %>% group_by(Species) %>% mutate_at(c("Sepal.Length", "Sepal.Width"), function(x) x[which.max("Petal.Width")]) 

#However, this works 
df_test <- iris %>% group_by(Species) %>% mutate_at(c("Sepal.Length", "Sepal.Width"), function(x) x + 100) 

Der Code df_attempt zu produzieren funktioniert nicht. Ich erhalte die folgende Fehlermeldung:

Error in mutate_impl(.data, dots) : 
    Column `Sepal.Length` must be length 50 (the group size) or one, not 0 

Irgendwelche Ideen, wie ich noch, um dieses während bekommen mutate_at mit?

+0

Der gewünschte Ausgang df_want ist. – udden2903

Antwort

2

Der Standard dplyr Weg wäre:

df_want <- iris %>% 
    group_by(Species) %>% 
    mutate(Sepal.Length = Sepal.Length[which.max(Petal.Width)], 
     Sepal.Width = Sepal.Width[which.max(Petal.Width)]) 

df_attempt <- iris %>% 
    group_by(Species) %>% 
    mutate_at(vars(Sepal.Length, Sepal.Width), funs(.[which.max(Petal.Width)])) 

Ergebnis:

# A tibble: 150 x 5 
# Groups: Species [3] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
      <dbl>  <dbl>  <dbl>  <dbl> <fctr> 
1   5   3.5   1.4   0.2 setosa 
2   5   3.5   1.4   0.2 setosa 
3   5   3.5   1.3   0.2 setosa 
4   5   3.5   1.5   0.2 setosa 
5   5   3.5   1.4   0.2 setosa 
6   5   3.5   1.7   0.4 setosa 
7   5   3.5   1.4   0.3 setosa 
8   5   3.5   1.5   0.2 setosa 
9   5   3.5   1.4   0.2 setosa 
10   5   3.5   1.5   0.1 setosa 
# ... with 140 more rows 

> identical(df_want, df_attempt) 
[1] TRUE 

Hinweis:

  1. Mit vars Sie verweisen können Variablen mit NSE.

  2. Mit funs kann man jede Spalte mit einem ., Referenz, die auf function(x) x entspricht

Verwandte Themen