我想在 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 个值的最常见组合的有效方法是什么?
非常感谢!
我想在 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 个值的最常见组合的有效方法是什么?
非常感谢!
这是一种方法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)
快速而肮脏的解决方案。不过,我相信有一种更奇特的方法,使用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"
像这样的东西??
> 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
这是一个tidyverse
解决方案。按所有变量分组并获得每组的计数的好处是您可以查看所有其他组的计数,而不仅仅是最大值。
library(tidyverse)
dat <- data.frame(age=c(50,55,60,50,55),sex=c(1,1,1,0,1),bmi=c(20,25,30,20,25))
dat %>%
group_by_all() %>%
summarise(count = n()) %>%
arrange(desc(count))
#> # A tibble: 4 x 4
#> # Groups: age, sex [4]
#> age sex bmi count
#> <dbl> <dbl> <dbl> <int>
#> 1 55 1 25 2
#> 2 50 0 20 1
#> 3 50 1 20 1
#> 4 60 1 30 1
由reprex 包(v0.2.0)于 2018 年 10 月 17 日创建。