当前位置 : 主页 > 网络推广 > seo >

检索数据帧中两列中最重复的(x,y)值

来源:互联网 收集:自由互联 发布时间:2021-06-16
我正在数据帧中存储(x,y)值.我想返回最常出现的(x,y)组合. 这是一个例子: x = c(1, 1, 2, 3, 4, 5, 6) y = c(1, 1, 5, 6, 9, 10, 12) xy = data.frame(x, y) xy x y1 1 12 1 13 2 54 3 65 4 96 5 107 6 12 最常见的(x,y)值将
我正在数据帧中存储(x,y)值.我想返回最常出现的(x,y)组合.

这是一个例子:

> x = c(1, 1, 2, 3, 4, 5, 6)
> y = c(1, 1, 5, 6, 9, 10, 12)
> xy = data.frame(x, y)
> xy
  x  y
1 1  1
2 1  1
3 2  5
4 3  6
5 4  9
6 5 10
7 6 12

最常见的(x,y)值将是(1,1).

我尝试了here的单列.它适用于单列,但不适用于两列的总计.

> tail(names(sort(table(xy$x))), 1)
[1] "1"
> tail(names(sort(table(xy$x, xy$y))), 1)
NULL

如何在R中的数据帧中检索两列中最重复的(x,y)值?

编辑:c(1,2)应与c(2,1)不同.

(尽管所有的加票,@DavidArenburg和我的方法的混合

res = do.call("paste", c(xy, sep="\r"))
which.max(tabulate(match(res, res)))

可能是简单有效的.)

也许这似乎是一点点的,但第一步是将xy列中的可能的任意值转换为整数,范围从1到列中唯一值的数量

x = match(xy[[1]], unique(xy[[1]]))
y = match(xy[[2]], unique(xy[[2]]))

然后将列的组合编码为唯一值

v = x + (max(x) - 1L) * y

索引最小化考虑的值的范围,并且编码将二维问题减少到单个维度.这些步骤将任何列表所需的空间(如其他答案中的table())减少到最小,而不创建字符向量.

如果一个人希望在一个维度上发生最常见的事件,那么可以索引并列出v

tbl = tabulate(match(v, v))

并找到最大值的第一次出现的索引,例如,

df[which.max(tbl),]

这里有一个功能来做魔术

whichpairmax <- function(x, y) {
    x = match(x, unique(x)); y = match(y, unique(y))
    v = x + (max(x) - 1L) * y
    which.max(tabulate(match(v, v)))
}

和几个测试

> set.seed(123)
> xy[whichpairmax(xy[[1]], xy[[2]]),]
  x y
1 1 1
> xy1 = xy[sample(nrow(xy)),]
> xy1[whichpairmax(xy1[[1]], xy1[[2]]),]
  x y
1 1 1
> xy1
  x  y
3 2  5
5 4  9
7 6 12
4 3  6
6 5 10
1 1  1
2 1  1

对于任意的data.frame

whichdfmax <- function(df) {
    v = integer(nrow(df))
    for (col in df) {
        col = match(col, unique(col))
        v = col + (max(col) - 1L) * match(v, unique(v))
    }
    which.max(tabulate(match(v, v)))
}
网友评论