【问题标题】:Extract multiple values from a dataset by subsetting with a vector通过向量子集从数据集中提取多个值
【发布时间】: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


【解决方案1】:

首先将您的数据转换为数据框(如果之前未完成)。

Navi <- data.frame(Navi)
Savi <- data.frame(dataset1[,7:14])

然后使用合并来过滤你的行:

df1 <- merge(Navi, Savi, by = c("f","g","h"))

保存来自 df1 的“L1”和“FR”平均值:

Average1 <- ((df1$L1+df1$FR)/2)

获取在 f、g、h 列上不完全匹配的新 Navi 数据框

Navi_new <- Navi[!duplicated(rbind(df1, Navi))[-seq_len(nrow(df1))], ]

用于将值与最接近的匹配项进行比较:

A1 <- vapply(Navi_new$f, function(x) x-Savi$f, numeric(3))
A2 <- apply(abs(A1), 2, which.min)
B1 <- vapply(A1$g, function(x) x-Savi$g, numeric(3))
B2 <- apply(abs(B1), 2, which.min)
C1 <- vapply(B1$g, function(x) x-Savi$g, numeric(3))
C2 <- apply(abs(C1), 2, which.min)

您可以使用 C2 数据框来获取“L1”和“FR”的平均值,例如后退 3 步。

【讨论】:

  • 首先非常感谢您的回答!在尝试您的答案时,我收到一条错误消息“Navi_new
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2017-03-18
相关资源
最近更新 更多