2017-12-18 4 views
0

Ich möchte eine zusätzliche Spalte zur iris Tabelle haben, so dass innerhalb derselben Species die erste Zeile NA ist und die restlichen Zeilen 1 sind, wenn Petal.Width gleich ist wie die letzte Zeile (die Zeile rechts oben), oder 0, wenn sich Petal.Width von der letzten Zeile unterscheidet.dplyr wie man die rowwise konditionale muate Operation macht

Wie erreiche ich dies mit dplyr? Die Änderungsspalte unten ist erwünscht.

Sepal.Length Sepal.Width Petal.Length Petal.Width Species Change 
1   5.1   3.5   1.4   0.2 setosa NA 
2   4.9   3.0   1.4   0.2 setosa 0 
3   4.7   3.2   1.3   0.2 setosa 0 
4   4.6   3.1   1.5   0.2 setosa 0 
5   5.0   3.6   1.4   0.2 setosa 0 
6   5.4   3.9   1.7   0.4 setosa 1 
+0

'Iris%>% group_by (Spezies)%>% mutieren (! Änderung = Petal.Width - lag (Petal.Width) = 0)' ; wrap in 'as.integer' wenn du magst. Äquivalent, 'c (NA, diff (Petal.Width)! = 0)' – alistaire

+0

hm, eigentlich 'as.integer (Petal.Width! = Lag (Petal.Width))' ist etwas lesbarer, obwohl ich immer noch denke es ist besser, es als logisch zu lassen, wenn es das ist, was es ist – alistaire

Antwort

3

dplyr hat eine lag() Funktion:

iris %>% group_by(Species) %>% 
    mutate(Change = ifelse(lag(Petal.Width)==Petal.Width,0,1)) 

# A tibble: 150 x 6 
# Groups: Species [3] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species Change 
      <dbl>  <dbl>  <dbl>  <dbl> <fctr> <dbl> 
1   5.1   3.5   1.4   0.2 setosa  NA 
2   4.9   3.0   1.4   0.2 setosa  0 
3   4.7   3.2   1.3   0.2 setosa  0 
4   4.6   3.1   1.5   0.2 setosa  0 
5   5.0   3.6   1.4   0.2 setosa  0 
6   5.4   3.9   1.7   0.4 setosa  1 
7   4.6   3.4   1.4   0.3 setosa  1 
8   5.0   3.4   1.5   0.2 setosa  1 
9   4.4   2.9   1.4   0.2 setosa  0 
10   4.9   3.1   1.5   0.1 setosa  1 
+0

Dies ist eine wirklich nette Lösung –

Verwandte Themen