我正在数据帧中存储(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 = 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))) }