Подмножество фрейма данных в R

У меня есть 2 кадра данных df2 а также DF,

> DF
        date tickers
1 2000-01-01       B
2 2000-01-01    GOOG
3 2000-01-01       V
4 2000-01-01    YHOO
5 2000-01-02     XOM

> df2
        date tickers quantities
1 2000-01-01      BB         11
2 2000-01-01     XOM         23
3 2000-01-01    GOOG         42
4 2000-01-01    YHOO         21
5 2000-01-01       V       2112
6 2000-01-01       B         13
7 2000-01-02     XOM         24
8 2000-01-02      BB        422

мне нужны значения из df2 те присутствуют в DF, Это означает, что мне требуется следующий вывод:

3 2000-01-01    GOOG         42
4 2000-01-01    YHOO         21
5 2000-01-01       V       2112
6 2000-01-01       B         13
7 2000-01-02     XOM         24

Поэтому я использовал следующий код:

> subset(df2,df2$date %in% DF$date & df2$tickers %in% DF$tickers)
        date tickers quantities
2 2000-01-01     XOM         23
3 2000-01-01    GOOG         42
4 2000-01-01    YHOO         21
5 2000-01-01       V       2112
6 2000-01-01       B         13
7 2000-01-02     XOM         24

Но вывод содержит один дополнительный столбец. Это потому, что ticker xom присутствует через 2 дня в df2, поэтому обе строки выбраны. Какая модификация необходима в моем коде?

Дпут выглядит следующим образом:

> dput(DF)
structure(list(date = structure(c(1L, 1L, 1L, 1L, 2L), .Label = c("2000-01-01", 
"2000-01-02"), class = "factor"), tickers = structure(c(4L, 5L, 
6L, 8L, 7L), .Label = c("A", "AA", "AAPL", "B", "GOOG", "V", 
"XOM", "YHOO", "Z"), class = "factor")), .Names = c("date", "tickers"
), row.names = c(NA, -5L), class = "data.frame")
> dput(df2)
structure(list(date = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L), .Label = c("2000-01-01", "2000-01-02"), class = "factor"), 
    tickers = structure(c(2L, 5L, 3L, 6L, 4L, 1L, 5L, 2L), .Label = c("B", 
    "BB", "GOOG", "V", "XOM", "YHOO"), class = "factor"), quantities = c(11, 
    23, 42, 21, 2112, 13, 24, 422)), .Names = c("date", "tickers", 
"quantities"), row.names = c(NA, -8L), class = "data.frame")

2 ответа

Решение

Это не сильно отличается от моего ответа на ваш пост, но требует небольшой модификации:

df2[duplicated(rbind(DF, df2[,1:2]))[-seq_len(nrow(DF))], ]

#         date tickers quantities
# 3 2000-01-01    GOOG         42
# 4 2000-01-01    YHOO         21
# 5 2000-01-01       V       2112
# 6 2000-01-01       B         13
# 7 2000-01-02     XOM         24

Примечание. Это обеспечивает вывод строк в том же порядке, в котором они были df2,


В качестве альтернативы, как предлагает Бен, используя merge:

merge(df2, DF, by=c("date", "tickers"))

также даст тот же результат (но не обязательно в том же порядке).

С помощью sqldf пакет:

require(sqldf)

sqldf("SELECT d2.date, d2.tickers, d2.quantities FROM df2 d2 
       JOIN DF d1 ON d1.date=d2.date AND d1.tickers=d2.tickers")

##        date tickers quantities
## 1 2000-01-01    GOOG         42
## 2 2000-01-01    YHOO         21
## 3 2000-01-01       V       2112
## 4 2000-01-01       B         13
## 5 2000-01-02     XOM         24
Другие вопросы по тегам