我想在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个值的最常见组合的有效方法是什么?
非常感谢!
答案 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创建。