R-对于一列中的每个观测值,在另一列中找到最接近的观测值
我正在尝试筛选数据帧,以仅保留满足以下条件的行: 对于每天和每个价格_1,仅保留价格_2最接近价格_1的行,如果两行距离相等,则取两个价格和波动率的平均值。例如:R-对于一列中的每个观测值,在另一列中找到最接近的观测值,r,R,我正在尝试筛选数据帧,以仅保留满足以下条件的行: 对于每天和每个价格_1,仅保留价格_2最接近价格_1的行,如果两行距离相等,则取两个价格和波动率的平均值。例如: Date price_2 price_1 Volat 2011-07-15 215 200.0 5 2011-07-15 217 200.0 6 2011-07-15 235
Date price_2 price_1 Volat
2011-07-15 215 200.0 5
2011-07-15 217 200.0 6
2011-07-15 235 200.0 5.5
2011-07-15 240 200.0 5.3
2011-07-15 200 201.5 6.2
2011-07-16 203 205.0 6.4
2011-07-16 207 205.0 5.1
Expected output:
Date price_2 price_1 Volat
2011-07-15 215 200.0 5
2011-07-15 200 201.5 6.2
2011-07-16 205 205.0 5.75
我是这样开始的,但我不知道如何继续:
group_by(Date) %>%
which(df,abs(df$price_1-df$price_2)==min(abs(df$price_1-df$price_2)))
提前多谢 一个
dplyr
选项可以是:
df %>%
group_by(Date, price_1) %>%
mutate(diff = abs(price_2 - price_1)) %>%
filter(diff == min(diff)) %>%
summarise_at(vars(price_2, Volat), mean)
Date price_1 price_2 Volat
<chr> <dbl> <dbl> <dbl>
1 2011-07-15 200 215 5
2 2011-07-15 202. 200 6.2
3 2011-07-16 205 205 5.75
df%>%
分组依据(日期、价格1)%>%
变异(差异=绝对值(价格2-价格1))%>%
过滤器(差异==最小(差异))%>%
汇总(变量(价格2,Volat),平均值)
日期价格\u 1价格\u 2价格
1 2011-07-15 200 215 5
2 2011-07-15 202. 200 6.2
3 2011-07-16 205 205 5.75
基本R解决方案:
price_summary <-
data.frame(do.call("rbind", lapply(split(
df, paste(df$Date, df$price_1, sep = " - ")
),
function(x) {
data.frame(
Date = unique(x$Date),
price_1 = unique(x$price_1),
price_2 = mean(x$price_2[which.min(abs(x$price_2 - x$price_1))]),
Volat = mean(x$Volat),
stringsAsFactors = FALSE
)
})),
row.names = NULL)
price\u摘要感谢您的回复。将其应用于我的数据时,我得到“错误:列diff
必须是长度2(组大小)或1,而不是25860”我无法重现此错误。您可以使用dput()
共享您的数据吗?
df <- structure(
list(
Date = structure(c(
15170, 15170, 15170, 15170,
15170, 15171, 15171
), class = "Date"),
price_2 = c(215L, 217L,
235L, 240L, 200L, 203L, 207L),
price_1 = c(200, 200, 200, 200,
201.5, 205, 205),
Volat = c(5, 6, 5.5, 5.3, 6.2, 6.4, 5.1)
),
row.names = c(NA,-7L),
class = "data.frame"
)