2016-06-19 27 views
3

Entschuldigung ein absoluter Anfänger, also haben einige sehr grundlegende Fragen!Subsetting eines Datenrahmens basierend auf Werten in einem anderen Datenrahmen

Ich habe eine sehr große Datenmenge, die von einem Haushalt einzelne Transaktionen auflistet. Beispiel ist unten.

# hh_id trans_type transaction_value 
# 1 hh1  food     4 
# 2 hh1  water     5 
# 3 hh1 transport     4 
# 4 hh2  water     3 
# 5 hh3 transport     1 
# 6 hh3  food    10 
# 7 hh4  food     5 
# 8 hh4 transport    15 
# 9 hh4  water    10 

Ich möchte einen neuen Datenrahmen erstellen, die alle Transaktionen für nur die Haushalte aufgeführt hat, die Transaktionen in der „Wasser“ -Kategorie haben. (ZB würde ich ein df ohne hh3 oben haben wollen, weil sie keine Ausgaben in "Wasser" hatten)

als ein erster Schritt, ich habe einen Datenrahmen mit einer Spalte (hh_ids), die nur die Haushalts-IDs hat die, die ich will. Wie unterteile ich dann meinen größeren Datenrahmen, um alle Zeilen von Transaktionen zu entfernen, die nicht aus einem Haushalt stammen und Ausgaben in der Kategorie "Wasser" haben?

Daten

## data from @gung 
d <- read.table(text="hh_id trans_type transaction_value 
hh1 food 4 
hh1 water 5 
hh1 transport 4 
hh2 water 3 
hh3 transport 1 
hh3 food 10 
hh4 food 5 
hh4 transport 15 
hh4 water 10", header=T) 
+1

'df2 <- df1 [! Df1 $ TRANS_TYPE = "Wasser",]' –

+1

@akrun es tölpeln ... diese ist sicherlich keine ursprüngliche Frage –

+0

Sie können benutze 'library (data.table); setDT (df1) [, if (any (trans_type ==" water ")) .SD, by = hh_id]' oder 'library (dplyr); df1%>% group_by (hh_id)%>% filter (beliebig (trans_type == "water")) 'Ich bin mir sicher, dass es Duples geben würde, aber leider konnte ich es jetzt nicht finden. (Es dauerte fast 10 Minuten, um Google zu suchen und konnte es immer noch nicht finden. Ist es nicht effizienter, eine Antwort einzugeben anstatt die Duplikate zu suchen?) – akrun

Antwort

4
d <- read.table(text="hh_id trans_type transaction_value 
hh1 food 4 
hh1 water 5 
hh1 transport 4 
hh2 water 3 
hh3 transport 1 
hh3 food 10 
hh4 food 5 
hh4 transport 15 
hh4 water 10", header=T) 

dw <- as.character(with(d, hh_id[trans_type=="water"])) 
ds <- d[which(d$hh_id%in%dw),] 
ds 
# hh_id trans_type transaction_value 
# 1 hh1  food     4 
# 2 hh1  water     5 
# 3 hh1 transport     4 
# 4 hh2  water     3 
# 7 hh4  food     5 
# 8 hh4 transport    15 
# 9 hh4  water    10 
Verwandte Themen