R检查数据帧中的行对

时间:2010-08-06 04:12:21

标签: r

我有一个数据框,其中包含有关此选项的信息

> chData
myIdx strike_price       date     exdate cp_flag strike_price    return
1 8355342       605000 1996-04-02 1996-05-18       P       605000  0.002340
2 8355433       605000 1996-04-02 1996-05-18       C       605000  0.002340
3 8356541       605000 1996-04-09 1996-05-18       P       605000 -0.003182
4 8356629       605000 1996-04-09 1996-05-18       C       605000 -0.003182
5 8358033       605000 1996-04-16 1996-05-18       P       605000  0.003907
6 8358119       605000 1996-04-16 1996-05-18       C       605000  0.003907
7 8359391       605000 1996-04-23 1996-05-18       P       605000  0.005695

其中cp_flag表示某个选项是call或put。有什么方法可以确保每个日期都有一个调用和一个put,并删除不存在的行?我可以用for循环来做,但是有更聪明的方法吗?

4 个答案:

答案 0 :(得分:10)

获取具有P的日期和具有C的日期,并使用相交来查找具有两者的日期。

keep_dates <- with(x, intersect(date[cp_flag=='P'], date[cp_flag=='C']) )
# "1996-04-02" "1996-04-09" "1996-04-16"

仅保留日期显示在keep_dates中的行。

x[ x$date %in% keep_dates, ]
#   myIdx strike_price       date     exdate cp_flag strike_price.1
# 8355342       605000 1996-04-02 1996-05-18       P         605000
# 8355433       605000 1996-04-02 1996-05-18       C         605000
# 8356541       605000 1996-04-09 1996-05-18       P         605000
# 8356629       605000 1996-04-09 1996-05-18       C         605000
# 8358033       605000 1996-04-16 1996-05-18       P         605000
# 8358119       605000 1996-04-16 1996-05-18       C         605000

答案 1 :(得分:1)

使用plyr包:

> ddply(chData, "date", function(x) if(all(c("P","C") %in% x$cp_flag)) x)
    myIdx strike_price       date     exdate cp_flag strike_price.1    return
1 8355342       605000 1996-04-02 1996-05-18       P         605000  0.002340
2 8355433       605000 1996-04-02 1996-05-18       C         605000  0.002340
3 8356541       605000 1996-04-09 1996-05-18       P         605000 -0.003182
4 8356629       605000 1996-04-09 1996-05-18       C         605000 -0.003182
5 8358033       605000 1996-04-16 1996-05-18       P         605000  0.003907
6 8358119       605000 1996-04-16 1996-05-18       C         605000  0.003907

答案 2 :(得分:1)

这是reshape方法。

library(reshape)
#Add a dummy value
df$value <- 1
check <- cast(df, myIdx + strike_price + date + exdate + strike_price + return ~ cp_flag)

#take stock of what just happened
summary(check)

#use only complete cases. If you have NAs elsewhere, this will knock out those obs too
check <- check[complete.cases(check),]

#back to original form
df.clean <- melt(check, id = 1:6)

答案 3 :(得分:0)

以下是使用splitlapply的一种方式:

> tmp <- lapply(split(d, list(d$date)), function(x) if(all(c('P', 'C') %in% x[, 5])) x)
> do.call(rbind, tmp)
             myIdx strike_price       date     exdate cp_flag strike_price    return
1996-05-18.1 8355342       605000 1996-04-02 1996-05-18       P       605000  0.002340
1996-05-18.2 8355433       605000 1996-04-02 1996-05-18       C       605000  0.002340
1996-05-18.3 8356541       605000 1996-04-09 1996-05-18       P       605000 -0.003182
1996-05-18.4 8356629       605000 1996-04-09 1996-05-18       C       605000 -0.003182
1996-05-18.5 8358033       605000 1996-04-16 1996-05-18       P       605000  0.003907
1996-05-18.6 8358119       605000 1996-04-16 1996-05-18       C       605000  0.003907
1996-05-18.7 8359391       605000 1996-04-23 1996-05-18       P       605000  0.005695

编辑:这是我上一个答案隐含的完整版本。我倾向于考虑基本功能而不是plyr或重塑...但这些答案似乎也很好。