Beispielcode

mtcars %>%
  group_by(am, gear) %>%
  summarise (n = n()) %>%
  mutate(percent_pos = n / sum(n))

Das führt zu:


# A tibble: 4 x 4
# Groups:   am [2]
     am  gear     n percent_pos
    <dbl> <dbl> <int>       <dbl>
1     0     3    15       0.789
2     0     4     4       0.211
3     1     4     8       0.615
4     1     5     5       0.385

Ich möchte den Wert 0,789 der Spalte percent_pos zu allen Fahrzeugen hinzufügen, die am = 0 sind, und zwar über eine neue Spalte im Datenrahmen mtcars mit der Bezeichnung percentage_positive

Obwohl ich in diesem Beispiel streng auf am = 0 oder am =1 verweisen kann (unter Verwendung einer if-Anweisung usw.), habe ich in meinem realen Datensatz Hunderte von Daten, für die dies gilt, was es schwierig macht, manuell zu arbeiten codieren Sie jede Referenz.

Ich hatte gehofft, die group_by-Funktion von dplyr verwenden zu können, um den Wert auf alle Zeilen anzuwenden, die nach am gruppiert sind, aber ich habe hier Probleme mit der mutate -Funktion.

1
Sparky_47 25 Juni 2019 im 21:39

3 Antworten

Beste Antwort

Wenn Sie nur den maximalen Prozentsatz pro Morgen aufzeichnen möchten, versuchen Sie Folgendes

max.per <- mtcars %>%
   group_by(am, gear) %>%
   summarise (n = n()) %>%
   mutate(percent_pos = n / sum(n)) %>%
   mutate(percent_pos = max(percent_pos)) %>%
   distinct(am,gear, percent_pos)

# A tibble: 4 x 3
# Groups:   am [2]
     am  gear percent_pos
  <dbl> <dbl>       <dbl>
1     0     3       0.789
2     0     4       0.789
3     1     4       0.615
4     1     5       0.615


mtc <- merge(mtcars, max.per, by = c("am","gear"))
2
Justin Landis 25 Juni 2019 im 19:16

Ich bin mir nicht sicher, ob ich vollständig verstehe, was Sie unter Folgendem verstehen:

Ich möchte allen Autos, die am = 0 sind, über eine neue Spalte im mtcars-Datenrahmen mit der Bezeichnung Prozent_positiv den Wert 0,789 der Spalte "prozent_pos" hinzufügen

Das Problem ist, dass Sie mehrere unterschiedliche percent_pos Werte für am == 0 berechnet haben (tatsächlich für jeden Wert von am). Es erscheint daher etwas willkürlich, nur den ersten Wert hervorzuheben. Vielleicht ist dies genau das, wonach Sie suchen, aber das geht aus den bereitgestellten Informationen nicht hervor. Wenn andererseits Ihre Frage tatsächlich lautet:

Wie ordne ich den berechneten percent_pos Wert, der jeder eindeutigen Kombination von am und gear entspricht, wieder den Originaldaten zu?

Dann sollte die folgende einfache left_join Operation Sie dorthin bringen:

mtcars %>%
  left_join(
    mtcars %>%
      group_by(am, gear) %>%
      summarise (n = n()) %>%
      mutate(percent_pos = n / sum(n)),
    by = c('am', 'gear')
  )

Die ersten / letzten 4 Zeilen des resultierenden Tibbles sehen wie folgt aus:

    mpg cyl disp  hp drat    wt  qsec vs am gear carb  n percent_pos
1  21.0   6  160 110 3.90 2.620 16.46  0  1    4    4  8   0.6153846
2  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4  8   0.6153846
3  22.8   4  108  93 3.85 2.320 18.61  1  1    4    1  8   0.6153846
4  21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 15   0.7894737

29 15.8   8  351 264 4.22 3.170 14.50  0  1    5    4  5   0.3846154
30 19.7   6  145 175 3.62 2.770 15.50  0  1    5    6  5   0.3846154
31 15.0   8  301 335 3.54 3.570 14.60  0  1    5    8  5   0.3846154
31 21.4   4  121 109 4.11 2.780 18.60  1  1    4    2  8   0.6153846

Dieser Ansatz sollte auf eine beliebige Anzahl von Gruppierungsvariablen skaliert werden können.

2
hendrikvanb 25 Juni 2019 im 19:12

Ich bin nicht sicher, ob ich Ihre Frage verstehe, aber vielleicht könnte mutate_if eine Lösung sein. Bedingung am == 0 Peter

0
Peter Hahn 25 Juni 2019 im 18:47