在data.frame中查找最常见的值组合

时间:2013-09-02 09:46:31

标签: r dataframe combinations

我想在data.frame中找到最常见的值组合。

以下是一些示例数据:

dat <- data.frame(age=c(50,55,60,50,55),sex=c(1,1,1,0,1),bmi=c(20,25,30,20,25))

在这个例子中,我要找的结果是age = 55,sex = 1和bmi = 25的组合,因为这是列值最常见的组合。

我的真实数据有大约30000行和20列。在30000个观测值中找到这20个值的最常见组合的有效方法是什么?

非常感谢!

4 个答案:

答案 0 :(得分:8)

以下是data.table的方法:

dt <- data.table(dat)
setkeyv(dt, names(dt))
dt[, .N, by = key(dt)]
dt[, .N, by = key(dt)][N == max(N)]
#    age sex bmi N
# 1:  55   1  25 2

基础R的方法:

x <- data.frame(table(dat))
x[x$Freq == max(x$Freq), ]
#    age sex bmi Freq
# 11  55   1  25    2

我不知道这些规模有多好,特别是如果组合的数量会很大。所以,回来测试并报告!


如果您真的只对一行结果感兴趣,请将x$Freq == max(x$Freq)替换为which.max(x$Freq),将N == max(N)替换为which.max(N)

答案 1 :(得分:1)

这样的东西?

> dat[duplicated(dat), ]
  age sex bmi
5  55   1  25

使用while(可能很耗时)

这是另一个重复超过1个案例的data.frame

> dat <- data.frame(age=c(50,55,60,50,55, 55, 60),
                   sex=c(1,1,1,0,1, 1,1),
                   bmi=c(20,25,30,20,25, 25,30))
> dat[duplicated(dat), ] # see data.frame
      age sex bmi
    5  55   1  25
    6  55   1  25
    7  60   1  30


# finding the most repeated item
> while(any(duplicated(dat))){
   dat <- dat[duplicated(dat), ]
   #print(dat)
 }

> print(dat)
  age sex bmi
6  55   1  25

答案 2 :(得分:1)

快速而肮脏的解决方案。我确信有一种更加方便的方法,使用plyr包或类似的方法。

> (tab <- table(apply(dat, 1, paste, collapse=", ")))
50, 0, 20 50, 1, 20 55, 1, 25 60, 1, 30 
        1         1         2         1 

> names(which.max(tab))
[1] "55, 1, 25"

答案 3 :(得分:0)

这是一个{"label":"DRUG","pattern":{"lower":"aspirin"}} {"label":"DRUG","pattern":{"lower":"trazodone"}} {"label":"DRUG","pattern":{"lower":"citalopram"}} 解决方案。按所有变量分组并获得每组的计数的好处是,您可以看到所有其他组的计数,而不仅仅是最大值。

tidyverse

reprex package(v0.2.0)于2018-10-17创建。