我正在尝试向我们quantmod::getSymbols
和quantmod::getEarningsCalendar
移除报告给定股票的收益的所有日期,我输入并循环显示。
我已尝试使用match
和grep
功能,但尚未获得成功。
例如:
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将有额外的无关数据列。
答案 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=
(在本例中为两列)。