Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-对于一列中的每个观测值,在另一列中找到最接近的观测值_R - Fatal编程技术网

R-对于一列中的每个观测值,在另一列中找到最接近的观测值

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

我正在尝试筛选数据帧,以仅保留满足以下条件的行:

对于每天和每个价格_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            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"
)