查找表中第3个四分位数的频率

时间:2015-05-19 17:02:54

标签: r frequency categorical-data contingency

我有一个大数据框架(对57个变量进行了+ 239k观察),并为不同年龄段的人们提供了一些疾病描述和药物治疗。我想找到每种疾病描述频率最高四分之一的药物。

为了制作一个可重复的例子,我创建了一个1000个观测数据框:

set.seed(1);sk<-as.factor(sample(c("sick A","sick B","sick C","sick D"),1000,replace=T));md<-as.factor(sample(c("med 1","med 2","med 3","med 4","med 5")));age<-as.factor(sample(c("group a","group b","group c"),1000,replace=T))
df<-data.frame(obs=1:1000,md=md,sk=sk,age=age)

我可以用

生成一个频率表
xt<-xtabs(~md+sk+age,df)

然后我可以为每个年龄组生成一个数据框

XTDF_a<-as.data.frame(xt[,,"group a"])

然后找到每种疾病的第3个四分位频率:

Q3_a<-apply(XTDF_a,2,function(x) quantile(x,probs = .75))

我可以比较并获得哪些药物超过每个疾病的第3个四分位数

XTDF_a>Q3_a


    sk
md      sick A sick B sick C sick D
  med 1  FALSE  FALSE   TRUE  FALSE
  med 2  FALSE  FALSE  FALSE  FALSE
  med 3   TRUE   TRUE  FALSE  FALSE
  med 4  FALSE  FALSE  FALSE   TRUE
  med 5  FALSE  FALSE  FALSE  FALSE

我可以得出结论,med 3是疾病A的首选,依此类推(我正在循环提取该信息)。然后我回过头来重复b,c组的过程....这对于我的数据大小几乎是不可能的(疾病大约是4200级,药物大约是1150级)。

我很确定应该有一种不同的,更简单的方法来实现这一目标。我很欣赏有关更好的道路的暗示。

2 个答案:

答案 0 :(得分:2)

<a ng-click="delete({{data.id}})">Delete</a></td> 可以处理三维数组,您可以指定多个维度进行迭代:

apply

答案 1 :(得分:1)

我认为您可以通过编写更精确的函数来加快速度,然后使用aggregate来获得结果。如果您想要更基于列表的方法,也可以使用by,这可能对您的下次使用更有用。我认为它仍然会很慢,但不如循环慢。

# Here is what you gave me originally
set.seed(1)
sk<-as.factor(sample(c("sick A","sick B","sick C","sick D"),1000,replace=T))
md<-as.factor(sample(c("med 1","med 2","med 3","med 4","med 5")))
age<-as.factor(sample(c("group a","group b","group c"),1000,replace=T))
df<-data.frame(obs=1:1000,md=md,sk=sk,age=age)

# Define a function that basically does what you did before, but uses table()
func.get_75th_meds <- function(vector_of_meds) {

    freq <- table(vector_of_meds)
    return(names(freq)[freq >= quantile(x = freq,probs = 0.75)])
}

aggregate(x = list(Meds = df$md),
          by = list(Sickness = df$sk,Group = df$age),
          FUN = func.get_75th_meds)

   Sickness   Group                       Meds
1    sick A group a               med 3, med 5
2    sick B group a               med 3, med 5
3    sick C group a med 1, med 2, med 4, med 5
4    sick D group a               med 2, med 4
5    sick A group b               med 4, med 5
6    sick B group b        med 1, med 2, med 5
7    sick C group b               med 1, med 2
8    sick D group b               med 2, med 3
9    sick A group c               med 2, med 5
10   sick B group c               med 2, med 4
11   sick C group c        med 1, med 2, med 4
12   sick D group c        med 1, med 3, med 4

编辑添加:这是by()使用相同功能的替代方案。

by(data = df$md,
   INDICES = list(Sickness = df$sk,Group = df$age),
   FUN = func.get_75th_meds)

Sickness: sick A
Group: group a
[1] "med 3" "med 5"
---------------------------------------------------------------
Sickness: sick B
Group: group a
[1] "med 3" "med 5"
---------------------------------------------------------------
... and so on