ersetzen Gruppen auf der Grundlage der Bedingung

stimmen
3

Ich habe ein data.frame ( df), siehe Beispiel, die Informationen über Personen enthält. Basierend auf einer Schlüsselspalte ( sleutel), weiß ich , wenn Menschen zusammen leben (zB eine Familie bilden) oder nicht. Nun, ich brauche neue Spalten mit Informationen über den ‚Kopf‘ der Familie zu schaffen.

     name   sex gzverh   sleutel gzhfd lft
1 Loekens   Man      6  1847LS 9     3  49
2   Kemel Vrouw      5 1847LK 10     2  18
3   Kemel   Man      5 1847LK 10     2  22
4 Boersma Vrouw      4 1847LK 10     2  52
5   Kemel   Man      2 1847LK 10     1  54

So zum Beispiel: Reihe 5, Kemel, männliche und gzhfd 1 (= Kopf der Familie Kemel). Er ist mit mrs verheiratet. Boersma (gleiche Taste). Ich möchte eine neue Spalte (mutieren lfthbfür alle Familienmitglieder) mit dem Alter des Kopfes der Familie. So sollte etwa so geworden:

     name  sex  gzverh   sleutel gzhfd lft lfthb
1 Loekens   Man      6  1847LS 9     3  49    NA
2   Kemel Vrouw      5 1847LK 10     2  18    54
3   Kemel   Man      5 1847LK 10     2  22    54
4 Boersma Vrouw      4 1847LK 10     2  52    54
5   Kemel   Man      2 1847LK 10     1  54    54

Ich habe versucht , mehr Möglichkeiten , mit dplyrmehreren Kombinationen der Verwendung group_by, case_whenund if_elseAussagen. Und ich schaffe selbst die Spalte für den Kopf der Familie mutieren. Aber nicht für die anderen Mitglieder.

Zum Beispiel ändert sich offenbar nur um den Wert für den Kopf selbst:

df <- df %>% mutate(lfthb  = case_when(sleutel == lag(sleutel) & gzhfd == 1 ~ lft))

Aber wie die schließen , gzhfd == 1nachdem das ~?

dput von Beispiel Daten:

structure(list(naam = c(Loekens, Kemel, Kemel, Boersma, 
Kemel), gesl = c(Man, Vrouw, Man, Vrouw, Man), gzverh = c(6L, 
5L, 5L, 4L, 2L), sleutel = c(1847LS 9, 1847LK 10, 1847LK 10, 
1847LK 10, 1847LK 10), gzhfd = c(3, 2, 2, 2, 1), lft = c(49, 
18, 22, 52, 54)), row.names = c(NA, 5L), class = data.frame)
Veröffentlicht am 19/12/2018 um 14:09
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
2

Eine Kombination aus replaceund ifelsewird die Arbeit tun, das heißt,

library(tidyverse)

df %>% 
 group_by(sleutel) %>% 
 mutate(lfthb = ifelse(any(gzhfd == 1), replace(lft, gzhfd != 1, lft[gzhfd == 1]), NA))

das gibt,

# A tibble: 5 x 7
# Groups:   sleutel [2]
  naam    gesl  gzverh sleutel   gzhfd   lft lfthb
  <chr>   <chr>  <int> <chr>     <dbl> <dbl> <dbl>
1 Loekens Man        6 1847LS 9      3    49    NA
2 Kemel   Vrouw      5 1847LK 10     2    18    54
3 Kemel   Man        5 1847LK 10     2    22    54
4 Boersma Vrouw      4 1847LK 10     2    52    54
5 Kemel   Man        2 1847LK 10     1    54    54

Wie @Ronak erwähnt, können wir das weglassen replaceTeil

df %>% 
 group_by(sleutel) %>% 
 mutate(lfthb = if (any(gzhfd == 1)) lft[gzhfd == 1] else NA)
Beantwortet am 19/12/2018 um 14:20
quelle vom benutzer

stimmen
0

Ein data.table Ansatz (kehrt -Inf statt NA für die Gruppe mit fehlenden Daten):

dt<-df %>% as.data.table() %>% 
  .[gzhfd==1, lfthb := lft, by="sleutel"] %>% 
  .[,lfthb:= max(lfthb,na.rm = T), by="sleutel"]
Beantwortet am 19/12/2018 um 15:06
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more