我有一个包含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
的最小值Var1
和Var2
)。在此示例中,将提取四个值: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,]
}
}
它肯定不是最漂亮的,如果有人有更优雅的解决方案,我会很高兴听到它们并学到新东西!
答案 0 :(得分:0)
您可以在下面执行以下操作。这将从value
中提取2个最低值,以便忽略Var1
和Var2
的重复。
head(sort(df[!duplicated(df$Var1) & !duplicated(df$Var2),'value']),2)