我有一个数据集,其中包含[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")
答案 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