我有一个数据集,我在其中尝试创建一个while循环,以便新变量更改,直到满足条件。我正在使用数据表和重复中断功能,但它无法正常工作。示例如下所示。
X <- as.character(c("A", "A", "A", "B", "B", "B", "C", "C", "C", "C"))
Y <- as.numeric(c(1,0,0,0,0,1.5,1,1,2,0))
df_sample <- data.frame(X, Y)
现在我想计算col X中每个类别从0.75到1的四分位数,这样当四分位答案是> = 1时,它就会停止,否则它会继续在指定的四分位列表中循环。
下面是Quartile列表,例如
TS_Q_list <- c(0.75,0.80,0.85,0.90,0.92,0.95,1)
我正在寻找的答案如下。因此,在下面的示例中,在第3行中,迭代停止在四分位数0.75,因为TS_Q> = 1而第2行符合四分位数0.85的条件,答案为1.05
X obs TS_Q TS_Q2
1 A 3 1.00 1.00
2 B 3 1.05 0.85
3 C 4 1.25 0.75
我尝试使用以下代码,但它无效。有人能告诉我为什么下面的代码可能不起作用,以及解决这个问题的最佳方法是什么?
df <- setDT(df_sample)[,. (obs = .N,
repeat {
j <- j + 1
TS_Q = quantile(Y ,TS_Q_list[j], na.rm = TRUE)
if(TS_Q<0){
break
}
}
]
答案 0 :(得分:1)
这是我解决它的方式,希望它有效
df <- df_sample
TS_Q <- TS_Q2 <- NULL
q = matrix(NA,nrow=length(TS_Q_list),ncol = length(unique(df$X)))
for(i in 1:3){
q[,i] <- quantile(subset(df, X == unique(df$X)[i])$Y, TS_Q_list)
TS_Q[i] <- min(q[,i][q[,i] >= 1])
TS_Q2[i] <- TS_Q_list[min(which(q[,i] >= 1))]}
data.frame(X = unique(df$X), obs = aggregate(df, list(X = X),length)[,2],
TS_Q = TS_Q,TS_Q2 = TS_Q2)