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

时间:2015-04-28 13:26:26

标签: r dataframe

我将while (vm.SaveCommand.Executing) ; 值存储在数据框中。我想返回最常出现的(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)

我为单个列尝试了答案here。它适用于单个列,但不适用于两列的聚合。

(1, 1)

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

编辑:> tail(names(sort(table(xy$x))), 1) [1] "1" > tail(names(sort(table(xy$x, xy$y))), 1) NULL 应被视为与c(1, 2)不同。

10 个答案:

答案 0 :(得分:11)

不确定所需的输出应该如何,但这是一个可能的解决方案

res <- table(do.call(paste, xy))
res[which.max(res)]
# 1 1 
#   2 

为了获得实际值,可以做

res <- do.call(paste, xy) 
xy[which.max(ave(seq(res), res, FUN = length)), ]
#   x y
# 1 1 1

答案 1 :(得分:9)

(尽管所有的加票,@ 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)))
}

答案 2 :(得分:7)

尝试

library(data.table)
setDT(xy)[, .N,list(x,y)][which.max(N)]
#   x y N
#1: 1 1 2

答案 3 :(得分:4)

t<-table(xy)
which(t == max(t), arr.ind = TRUE)

<强>更新

正如David Arenburg所指出的,初始代码只返回table(xy)函数中值的索引。如果您需要最大值的值和可能出现的次数,您可以尝试:

t<-table(xy)
indexes <- which(t == max(t), arr.ind = TRUE)[1,]
x_value <- dimnames(t)$x[indexes["x"]]
y_value <- dimnames(t)$y[indexes["y"]]
rep_number <- max(t)

现在我怀疑有更好的方法来编写最后三行代码,但我还是R世界的新手

答案 4 :(得分:3)

code for sm_35
        Function : _Z14triUnrollTest1Pf
.headerflags    @"EF_CUDA_SM35 EF_CUDA_PTX_SM(EF_CUDA_SM35)"
                                                          /* 0x08b8b8a0b010a000 */
/*0008*/                   MOV R1, c[0x0][0x44];          /* 0x64c03c00089c0006 */
/*0010*/                   MOV R0, c[0x0][0x140];         /* 0x64c03c00281c0002 */
/*0018*/                   IADD R2.CC, R0, 0x10;          /* 0xc0840000081c0009 */
/*0020*/                   MOV32I R0, 0x3f800000;         /* 0x741fc000001fc002 */
/*0028*/                   IADD.X R3, RZ, c[0x0][0x144];  /* 0x60804000289ffc0e */
/*0030*/                   ST.E [R2], R0;                 /* 0xe4800000001c0800 */
/*0038*/                   ST.E [R2+0x10], R0;            /* 0xe4800000081c0800 */
                                                          /* 0x080000b810b8b8b8 */
/*0048*/                   ST.E [R2+0x14], R0;            /* 0xe48000000a1c0800 */
/*0050*/                   ST.E [R2+0x20], R0;            /* 0xe4800000101c0800 */
/*0058*/                   ST.E [R2+0x24], R0;            /* 0xe4800000121c0800 */
/*0060*/                   ST.E [R2+0x28], R0;            /* 0xe4800000141c0800 */
/*0068*/                   EXIT;                          /* 0x18000000001c003c */
/*0070*/                   BRA 0x70;                      /* 0x12007ffffc1c003c */
/*0078*/                   NOP;                           /* 0x85800000001c3c02 */
        .....................................


        Function : _Z14triUnrollTest2Pf
.headerflags    @"EF_CUDA_SM35 EF_CUDA_PTX_SM(EF_CUDA_SM35)"
                                                          /* 0x08b8b8a0b010a000 */
/*0008*/                   MOV R1, c[0x0][0x44];          /* 0x64c03c00089c0006 */
/*0010*/                   MOV R0, c[0x0][0x140];         /* 0x64c03c00281c0002 */
/*0018*/                   IADD R2.CC, R0, 0x10;          /* 0xc0840000081c0009 */
/*0020*/                   MOV32I R0, 0x3f800000;         /* 0x741fc000001fc002 */
/*0028*/                   IADD.X R3, RZ, c[0x0][0x144];  /* 0x60804000289ffc0e */
/*0030*/                   ST.E [R2], R0;                 /* 0xe4800000001c0800 */
/*0038*/                   ST.E [R2+0x10], R0;            /* 0xe4800000081c0800 */
                                                          /* 0x080000b810b8b8b8 */
/*0048*/                   ST.E [R2+0x14], R0;            /* 0xe48000000a1c0800 */
/*0050*/                   ST.E [R2+0x20], R0;            /* 0xe4800000101c0800 */
/*0058*/                   ST.E [R2+0x24], R0;            /* 0xe4800000121c0800 */
/*0060*/                   ST.E [R2+0x28], R0;            /* 0xe4800000141c0800 */
/*0068*/                   EXIT;                          /* 0x18000000001c003c */
/*0070*/                   BRA 0x70;                      /* 0x12007ffffc1c003c */
/*0078*/                   NOP;                           /* 0x85800000001c3c02 */
        .....................................

答案 5 :(得分:2)

这个怎么样?

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

table(xy)
y
x   1 5 6 9 10 12
1 2 0 0 0  0  0
2 0 1 0 0  0  0
3 0 0 1 0  0  0
4 0 0 0 1  0  0
5 0 0 0 0  1  0
6 0 0 0 0  0  1

答案 6 :(得分:1)

library(dplyr)
xy %>%
  group_by(x, y) %>%
  tally() %>%
  ungroup %>%
  top_n(1)

答案 7 :(得分:1)

使用dplyr

library(dplyr)

xy %>% group_by(x, y) %>% summarise(n=n()) %>% 
   ungroup %>% filter(n==max(n)) %>% select(-n)

答案 8 :(得分:1)

晚会,但这是时间测试:

 colx    
 -----
 2

答案 9 :(得分:1)

使用sqldf

library(sqldf)    
sqldf('SELECT x, y 
          FROM xy 
          GROUP BY (x||y) 
          ORDER BY COUNT(*) DESC 
          LIMIT 1')
  x y
1 1 1 

如果我们想显示一个频率列,而不只是一行(如果有任何关系):

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

sqldf('SELECT x, y, COUNT(*) AS freq
      FROM xy 
      GROUP BY (x||y) 
      ORDER BY COUNT(*) DESC')

   x  y freq
1  1  1    2
2 12 12    2
3  2  5    1
4  3  6    1
5  4  9    1