【发布时间】:2020-01-01 14:01:29
【问题描述】:
我有一个名为“Navi”的数据框,有 72 行描述了三个变量 f、g 和 h 的所有可能组合。
head(Navi)
f g h
1 40.00000 80 0.05
2 57.14286 80 0.05
3 74.28571 80 0.05
4 91.42857 80 0.05
5 108.57143 80 0.05
6 125.71429 80 0.05
我有一个数据集,其中还包含这 3 个变量 f、g 和 h 以及其他几个变量。
head(dataset1[,7:14])
# A tibble: 6 x 8
h f g L1 L2 Ref1 Ref2 FR
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0.02 20 100 53 53 0.501 2.00 2
2 0.02 20 260 67 67 0.200 5.01 5.2
3 0.02 20 420 72 71 0.128 7.83 8.4
4 0.02 20 580 72 72 0.0956 10.5 11.6
5 0.02 20 740 73 73 0.0773 12.9 14.8
6 0.02 20 900 72 71 0.0655 15.3 18
我想做的是:
对于组合数据框中的每一行,通过三个变量 f、g 和 h 过滤数据集。
然后,如果有完全匹配,给我这个数据集的匹配行,然后提取这个数据集中“L1”和“FR”列中的值并计算它们的平均值。将平均值保存在向量“L_M2”和“FR_M2”中
如果没有完全匹配,请给我数据集中 f,g,h 最接近数据帧中 f,g,h 的行。然后提取这些行中 L 和 FR 的所有值,并计算平均值。将平均值保存在向量“L_M2”和“FR_M2”中。
我已经尝试过的:
我创建了两个空向量,稍后将保存提取的值。
然后我循环遍历组合数据帧的每一行,按 f、g 和 h 过滤数据集。
结果将是多行,其中 f、g 和 h 的值在数据集中与组合数据框的行中相同。
L_M2 <- vector()
FR_M2 <- vector()
for (i in 1:(nrow(Navi))){
matchingRows[i] <- dataset1[dataset1$P == "input$varP"
& dataset1$Las == input$varLas
& dataset1$Opt == input$varO
& dataset1$f == Navi[i,1]
& dataset1$g == Navi[i,2]
& dataset1$h == Navi[i,3]]
}
问题是,我不知道从这里开始该做什么。如果没有完全匹配,我不知道如何通过多个变量检查具有最接近值的行... 我过去只做过或多或少类似的事情,但我只检查了这样的关闭“g”值:
L_M2 <- vector()
FR_M2 <- vector()
for (i in 1:(nrow(Navi))){
matchingRows[i] <- dataset1[dataset1$P == "input$varP"
& dataset1$Las == input$varLas
& dataset1$Opt == input$varO
& dataset1$f == Navi[i,1]
& dataset1$g == Navi[i,2]
& dataset1$h == Navi[i,3]]
for (i in 1:(nrow(Navi)){
Differences <- abs(Navi[i,2]- matchingRows$G)
indexofMin <- which(Differences == min (Differences))
L_M2 <- append(L_M2, matchingRows$L[[indexofMin]], after = length(L_M2))
FR_M2 <- append(FR_M2, matchingRows$FR[[indexofMin]], after = length(FR_M2))
}
那么谁能告诉我如何实现这个提取过程?我对 R 还是很陌生,所以如果我犯了新手错误或忘记包含一些重要信息,请告诉我。谢谢!
【问题讨论】:
-
您正在寻找什么标准“如果没有完全匹配,请给我数据集中 f,g,h 与向量中的 f,g,h 最接近的行。
-
假设 Navi 数据框的第一行是 (40, 80, 0.05),而在 dataset1 中没有这样的行,请给我下一个关闭的行,例如可能存在 f=45、g=78 和 h= 0.03 的行
标签: r dataframe for-loop vector