从df2中出现的df1中删除元素

时间:2016-01-22 23:28:46

标签: r

我正在尝试向我们quantmod::getSymbolsquantmod::getEarningsCalendar移除报告给定股票的收益的所有日期,我输入并循环显示。

我已尝试使用matchgrep功能,但尚未获得成功。

例如:

ticker <- c("MSFT", "MSFT", "MSFT")
date <- c("2016-01-01", "2016-01-01", "2016-01-02")
df1 = data.frame(date,ticker)
df1
        date ticker
1 2016-01-01   MSFT
2 2016-01-01   MSFT
3 2016-01-02   MSFT

ticker <- c("AAPL", "GOOG", "MSFT")
date <- c("2016-01-01", "2016-01-02", "2016-01-02")
df2 = data.frame(date,ticker)
df2
     date ticker
1 2016-01-01   AAPL
2 2016-01-02   GOOG
3 2016-01-02   MSFT

我想删除df1中的第三行,因为它也出现在df2中,并获取:

      date ticker
1 2016-01-01   MSFT
2 2016-01-01   MSFT

使用pmatch我想出了这个:

library(dplyr)
ticker.matches <- as.data.frame(pmatch(df1$ticker, df2$ticker, nomatch = NA_integer_, duplicates.ok = FALSE))
date.matches <- as.data.frame(pmatch(df1$date, df2$date, nomatch = NA_integer_, duplicates.ok = FALSE))
results.df <- bind_cols(df1, ticker.matches, date.matches)
colnames(results.df) <- c("date", "ticker", "ticker.match", "date.match")
results.df[is.na(results.df)] <- 0
my.attempt <- subset(results.df, date.match != ticker.match)

这当然非常草率,但似乎有效,直到我意识到它无法处理重复。 请注意,df1和df很可能是不同的长度,df1将有额外的无关数据列。

2 个答案:

答案 0 :(得分:3)

你走了,

df1[!(apply(df1, 1, toString) %in% apply(df2, 1, toString)), ]
#         date ticker
# 1 2016-01-01   MSFT
# 2 2016-01-01   MSFT

如果您有“无关数据列”,则可以使用[1:2]

 df1[!(apply(df1[1:2], 1, toString) %in% apply(df2[1:2], 1, toString)), ]

答案 1 :(得分:2)

这是一个dplyr解决方案。我使用stringsAsFactors=FALSE创建了数据框,因为您可能遇到问题,除非您在两个数据框之间一致地指定因子。

ticker <- c("MSFT", "MSFT", "MSFT")
date <- c("2016-01-01", "2016-01-01", "2016-01-02")
df1 = data.frame(date,ticker, stringsAsFactors = FALSE)
df1

ticker <- c("AAPL", "GOOG", "MSFT")
date <- c("2016-01-01", "2016-01-02", "2016-01-02")
df2 = data.frame(date,ticker, stringsAsFactors = FALSE)
df2

df1 %>% filter( ! ((date == df2$date) & (ticker == df2$ticker)) )

#        date ticker
#1 2016-01-01   MSFT
#2 2016-01-01   MSFT

修改

另一种可能性是在anti_join

中使用dplyr
df1 %>% anti_join(df2, by = c('date'='date', 'ticker'='ticker'))

这将返回表df1中不在表df2中的键,并加入by=(在本例中为两列)。