从数据框中提取最小值而不重复其他列

时间:2016-11-23 04:00:16

标签: r

我有一个包含16行和3列的数据框(df):

Var1           Var2          value
1.060579189    1.018186563   0.042392626
0.020169078    0.119923679  -0.099754601
1.704759781    1.427241887   0.277517894
1.060579189    1.427241887  -0.366662698
1.060579189    0.636595019   0.42398417
-0.415685797   0.119923679  -0.535609476
0.020169078    0.636595019  -0.61642594
1.704759781    1.018186563   0.686573218
1.060579189    0.119923679   0.94065551
0.020169078    1.018186563  -0.998017484
-0.415685797   0.636595019  -1.052280816
1.704759781    0.636595019   1.068164762
0.020169078    1.427241887  -1.407072808
-0.415685797   1.018186563  -1.43387236
1.704759781    0.119923679   1.584836102
-0.415685797   1.427241887  -1.842927684

value列只是Var1 - Var2按绝对值排序。我希望能够在value列中提取最小值,因为前两列中没有任何值重复(即每个唯一对的value的最小值Var1Var2)。在此示例中,将提取四个值:0.042392626, -0.099754601, 0.277517894, -1.052280816。这是因为df[2,4]df[2,3]的重复,但因为df[2,3]首先出现,所以这是拉出的值。此外,我们必须跳过df[11,3]作为最后一个值,因为它是唯一剩下的唯一对。

有没有一种简单的方法可以在数据框的列和行上迭代地执行此操作?当我将其扩展到更复杂,更长的数据帧时,它会让生活变得更加轻松。

更新

我设法通过一些反复试验破解了这个问题:

fin <- df[1,]
for (k in 1:nrow(df)) {
  n <- k+1
  if(df[n,1] %in% fin[,'Var1']){
    next
  }
  if(df[n,2] %in% fin[,"Var2"]){
    next
  } else {
    fin[n,] <- df[n,]
  }
}

它肯定不是最漂亮的,如果有人有更优雅的解决方案,我会很高兴听到它们并学到新东西!

1 个答案:

答案 0 :(得分:0)

您可以在下面执行以下操作。这将从value中提取2个最低值,以便忽略Var1Var2的重复。

head(sort(df[!duplicated(df$Var1) & !duplicated(df$Var2),'value']),2)