对R中创建的变量重复break循环

时间:2018-03-15 19:10:20

标签: r

我有一个数据集,我在其中尝试创建一个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
          }
          }
          ]

1 个答案:

答案 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)