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

标签 r dataframe

我在收藏 (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)))
}

关于检索数据框中两列中重复次数最多的 (x, y) 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29920878/

相关文章:

r - R 中的平滑样条曲线中的 'cross-validation with non-unique ' x'值似乎可疑'是什么意思?

javascript - 如何格式化 Shiny updated numericInput 的输入但不更改实际值?

python - pandas 数据帧内存 python

python - 获取多索引中级别的最后一个元素

c++ - RCPP 'candidate function has different number of parameters (expected 0 but has 1)'

r - 在另一个 EC2 实例上安装后 R 的意外行为

r - 使用 R 以双对数刻度(以 10 为底)绘制分布的密度线

读取并绑定(bind)多个 csv 文件

python - 如何过滤掉列表列中包含特定子序列的 Pandas DataFrame 中的行?

python - 如何在 python pandas 的数据框中查找和更正拼写错误