Ihre Daten sind als Strings formatiert, so dass sie etwas schwierig zu bearbeiten sind. Im Allgemeinen ist es besser, sie als tatsächliche Datumsobjekte zu formatieren. Dies kann mit the lubridate package erfolgen. Folgendes würde ich tun. Ich verwende rearr Paket für die automatische Typerkennung und purrr für die funktionale Programmierung.
library(pacman)
p_load(lubridate, readr, purrr)
df = read_table(
'ID Date
1 1975-01-01
2 1980-02-01
9 1980-02-01
3 1985-05-01
4 1990-07-01
12 1990-07-01
16 1990-07-01
5 1990-08-01
6 1993-01-01
7 1993-09-01
67 1993-09-01'
)
dates = parse_date_time(c('1980-02', '1990-07', '1993-09'), orders = "Y-m")
#subset
df[year(df$Date) %in% year(dates) & month(df$Date) %in% month(dates), ]
Der Ausgang davon:
# A tibble: 7 × 2
ID Date
<int> <date>
1 2 1980-02-01
2 9 1980-02-01
3 4 1990-07-01
4 12 1990-07-01
5 16 1990-07-01
6 7 1993-09-01
7 67 1993-09-01
Also, wir die Daten laden, wie Sie getan haben, aber tun Sie es mit readr automatisch zu haben, um die Daten zu erkennen. Dann unterteilen wir die Zeilen, in denen das Jahr mit einem der Jahre im Objekt übereinstimmt, und der Monat stimmt mit einem der Monate im Objekt überein. Dies gibt die gewünschte Ausgabe.
Vielleicht möchten Sie jedoch nur die Kombinationen, die Sie gaben. So z.B. Jahr 1980 ist nur in Ordnung, wenn es mit Monat 2 auftritt. Wenn ja, ist es ein bisschen komplizierter. Dies könnte auf viele Arten geschehen, aber ich entschied mich für einen funktionalen Ansatz. Dies ist nicht die schnellste Ausführung, aber es ist schnell zu schreiben und sehr flexibel.
#subset stricter
inclusion_func = function(x, desired_dates) {
#loop over each date
map_lgl(x, function(date) {
any(map_lgl(desired_dates, function(desired_date) {
year(date) == year(desired_date) && month(date) == month(desired_date)
})
)
})
}
df[inclusion_func(df$Date, dates), ]
Der Ausgang davon ist das gleiche:
# A tibble: 7 × 2
ID Date
<int> <date>
1 2 1980-02-01
2 9 1980-02-01
3 4 1990-07-01
4 12 1990-07-01
5 16 1990-07-01
6 7 1993-09-01
7 67 1993-09-01
Was die Funktion tut, ist eine Schleife über jedes Datum in dem Datenrahmen, und eine Schleife über jedes Jahr/Monat Kombination. Es prüft dann, ob sowohl das Jahr als auch der Monat für diese bestimmte Kombination übereinstimmen. Wenn eine der drei Kombinationen übereinstimmt (daher any
), wird TRUE
für diese Zeile zurückgegeben.
Da Ihre Daten standardisiert zu sein scheinen, können Sie 'df [substr (df $ Date, 1,7)% in% dates,]' verwenden. Aber um sicherzugehen, wird die Verwendung von geeigneten Datum-Zeit-Formaten bevorzugt. –
'df [df $ Datum% in% as.Date (paste0 (Datum," - 01 ")),]'. Dies setzt voraus, dass "df $ Date" bereits im Datumsformat ist. – eipi10
vielen dank an alle! –