R-由2个因子变量组来计算四分位数

时间:2015-08-20 20:58:15

标签: r

我有一个数据集,其中包含[hourtime]和[Feedcodes]收集的记录数[reccount]。我要做的是创建一个列,告诉我每个记录属于哪个四分位数(probs = 0:4/4),以便我可以设置警报,如果有任何东西低于第1或第2四分位数并且我可以调查饲料,看看是否有异常。

我首先尝试了这个,但意识到它不是通过hourtime和feedcode进行分组

 df<-within(ds, quartile<-as.integer(cut(ds$reccount,quantile(ds$reccount,probs=0:4/4),inlcude.lowest=TRUE)))

试过这个,但它仍然没有回到我所期待的

    as<-ddply(ds,.(as.factor(ds$hourtime),ds$FeedCode) , function(df)quantile(ds$reccount,probs=0:4/4))

我只需要添加一个列,将其分类为哪个四分位数。 这是数据:

    dput(head(dss,30))
structure(list(rownames = c(2371L, 2428L, 2459L, 2493L, 2573L, 
2581L, 2606L, 2633L, 2668L, 2683L, 2693L, 2748L, 2756L, 2819L, 
2865L, 2889L, 2896L, 2970L, 2988L, 3005L, 3047L, 3067L, 3111L, 
3132L, 3154L, 3177L, 3209L, 3241L, 3272L), hourtime = c(3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), reccount = c(2864L, 
3492L, 968L, 3271L, 6078L, 767L, 1365L, 6222L, 2515L, 3986L, 
4327L, 5764L, 3676L, 5338L, 6407L, 1217L, 3058L, 5673L, 3569L, 
3391L, 3169L, 6446L, 4201L, 884L, 3529L, 6461L, 3414L, 3246L, 
5486L), FeedCode = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), .Label = "MDSWJD", class = "factor"), quartile = c(4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L)), .Names = c("rownames", 
"hourtime", "reccount", "FeedCode", "quartile"), row.names = c(NA, 
29L), class = "data.frame")

2 个答案:

答案 0 :(得分:0)

您可以使用ave()通过对变量进行分组来运行剪切/分位数:

dss$quartile <- with(dss, 
            ave(reccount, hourtime, FeedCode, 
                FUN=function(x).bincode(x, quantile(x), T,T)
                )
            )

答案 1 :(得分:0)

你让我与四分位数混淆,但有5组{0,1,2,3,4}。 我不知道我是否遗漏了一些东西,但这是一种dplyr方法。

第一个按组{hourtime,FeedCode}计算Q25%并标记下面的所有内容。第二个将每个组的4个组(四分位数)的reccount分配,并分配组号{1到4}。

逐步运行代码,如果发现错误,请告诉我。

library(dplyr)

# example dataset
dt = data.frame(hourtime = c(1,1,1,1,1,2,2,2,2,2),
                FeedCode = c("A","B","A","B","A","B","A","B","A","B"),
                reccount = c(946,184,1404,937,137,1199,698,1311,1302,560))   


dt %>% 
  group_by(hourtime, FeedCode) %>%
  mutate(Q25 = quantile(reccount,0.25),
         FlagBelowQ25 = ifelse(reccount < Q25, 1, 0)) %>%
  ungroup

#    hourtime FeedCode reccount    Q25 FlagBelowQ25
# 1         1        A      946 541.50            0
# 2         1        B      184 372.25            1
# 3         1        A     1404 541.50            0
# 4         1        B      937 372.25            0
# 5         1        A      137 541.50            1
# 6         2        B     1199 879.50            0
# 7         2        A      698 849.00            1
# 8         2        B     1311 879.50            0
# 9         2        A     1302 849.00            0
# 10        2        B      560 879.50            1


dt %>% 
  group_by(hourtime, FeedCode) %>%
  mutate(Quartile = ntile(reccount,4)) %>%
  ungroup

#    hourtime FeedCode reccount Quartile
# 1         1        A      946        2
# 2         1        B      184        1
# 3         1        A     1404        3
# 4         1        B      937        3
# 5         1        A      137        1
# 6         2        B     1199        2
# 7         2        A      698        1
# 8         2        B     1311        3
# 9         2        A     1302        3
# 10        2        B      560        1