2017-03-29 3 views
0

Ich habe folgende Daten in den Datenrahmen dfR Teilmenge von Datenrahmen für Kohortenanalyse

persons year 
personA 2015 
personB 2016 
personC 2015 
personB 2015 

wie kann ich Subset Funktion in R verwenden personB zu filtern, die im Jahr 2015 und 2016 ist ich verwende folgenden Code , funktioniert aber nicht

df1 <- subset(df, (year==2015 & year ==2016)) 
+1

Die erwartete Ausgabe ist nicht klar. – Misaki

+0

habe ich gerade den Datenrahmen korrigiert. Ich möchte Personen, die in 2015 und 2016 sind. PersonB ist in beiden Datenrahmen. – rstudy12

+0

Sie sind in der Nähe. Dieses Thema wird ausführlich in SO behandelt und Sie finden ein relevantes Beispiel (zB [hier] (http://stackoverflow.com/questions/4935479/how-to-combine-multiple-conditions-to-subset-a-data- frame-using-or)) – metasequoia

Antwort

1

ich dplyr dafür verwenden würde, wie es ist viel einfacher, als in der Basis R.

library(dplyr) 
df %>% group_by(persons) %>% filter(n() == 2) 

dieser Gruppe die Reihen von Person mit und behält dann nur Gruppen mit zwei Mitgliedern (beide Jahre).

+0

Nur weil 'n() == 2' bedeutet nicht, dass sie beide in 2015 und 2016 sind. Es könnte zwei Aufzeichnungen für ein Jahr oder Aufzeichnungen für zwei verschiedene Jahre geben, oder sie könnten in 2015, 2106 und 2014 sein und würden verpasst werden. – MrFlick

+0

Absolut zustimmen. Ich werde daran denken, diese Fälle zu bearbeiten. – Joe

+0

Ich denke 'df%>% group_by (personen)%>% filter (all (2015: 2016% in% year))" sollte den Trick machen, einen Wert für diese spezifischen Jahre zu verlangen (aber immer noch mögliche Duplikate zulassen). – MrFlick

0
df2 <- df[(df$year== 2015 | df$year== 2016),][1] 

## get each person and the number of his appearence in the dataframe 
t <- table(df2) 
# 
# personA personB personC 
# 1  2  1 

t[t>1] 
# personB 
# 2 

Der Datenrahmen

df <- data.frame("persons" = c("personA","personB","personC","personB"), 
"year" = c(2015,2016,2015,2015)) 

EDIT

Eine andere Lösung duplicated

duplicated(df$persons) 
#[1] FALSE FALSE FALSE TRUE 
df[duplicated(df$persons),1] 
# personB 
+0

Ich will Personen, die sowohl 2015 als auch 2016 sind. Ich möchte nicht basierend auf Personen filtern – rstudy12

0

ein Beispiel unter Verwendung data.table (und unique mehr Reihen von derselben Person in demselben Jahr zu handhaben):

library(data.table) 
dt <- structure(list(persons = c("personA", "personB", "personC", "personB" 
), year = c(2015L, 2016L, 2015L, 2015L)), .Names = c("persons", 
"year"), row.names = c(NA, -4L), class = "data.frame") 
setDT(dt) 
years <- c("2015", "2016") 
# Filter by years and make sure all rows are unique combinations of persons and 
# thoese years. Then set in_all_years to TRUE of number of rows is equal to 
# number of years 
out <- unique(dt[year %in% years])[, in_all_years := .N == length(years), 
    by = persons] 

> out 
    persons year in_all_years 
1: personA 2015  FALSE 
2: personB 2016   TRUE 
3: personC 2015  FALSE 
4: personB 2015   TRUE 
Verwandte Themen