R 嵌套';ifelse'-分位数语句

R 嵌套';ifelse'-分位数语句,r,if-statement,R,If Statement,我试图根据数据帧中的分位数,将一个从1到10的数字分配给一系列向量 到目前为止我已经试过了 quants <- quantile(Data$Avg, c(.1, .2, .3, .4, .5, .6, .7, .8, .9)) Data$quant <- for ( i in nrow(Data) ) { ifelse(Data$Avg [i] < quants[1], Data$quant[1] = 1 , ifelse(Data$Avg [i]

我试图根据数据帧中的分位数,将一个从1到10的数字分配给一系列向量

到目前为止我已经试过了

quants <- quantile(Data$Avg, c(.1, .2, .3, .4, .5, .6, .7, .8, .9)) 

Data$quant <- for ( i in nrow(Data) ) {
  ifelse(Data$Avg [i] < quants[1], Data$quant[1] = 1 , 
         ifelse(Data$Avg [i] > quants[1] & Data$Avg[i] < quants[2], Data$quant[1] = 2, Data$quant = 3
                   ))}
quants这应该可以:

Data$quant <- for ( i in nrow(Data) ) {
  Data$quant[1] <- ifelse(Data$Avg [i] < quants[1],  1, ifelse(Data$Avg [i] > quants[1] & Data$Avg[i] < quants[2], 2, 3))
}
您应该将
ifelse
条件的输出分配到它之外。即:

output <- ifelse(a > b, a, b)
输出b、a、b)

您最好使用
cut
而不是循环:

Data = data.frame(Avg = runif(100))
quantpoints <- seq(0.1, 0.9, 0.1)
quants <- quantile(Data$Avg, quantpoints)

cutpoints <- c(-Inf, quants, Inf)

cut(Data$Avg, breaks = cutpoints, labels = seq(1, length(cutpoints) - 1))
Data=Data.frame(平均值=runif(100))

量子点尝试使用常规的if语句,而不是
ifelse
,因为存在大量语法错误。例如,
Data$quant[1]=1
应该是
1
,不需要为
循环使用
。我会考虑使用
cut
findInterval
。谢谢回复。我尝试了第一种解决方案。然而,我在Data$Quant中得到了纯3,即使下面的测试
>Data$Avg[26]@papappa没有数据,也很难发现问题。你可能想要
dput
你的数据,以便我测试它。@papappapa如果它的逻辑不按预期工作,那么你的数据中就有某种东西,或者你的算法逻辑。太棒了。非常好的解决方案,我不知道。非常感谢。我刚刚添加了
数据$quant
Data = data.frame(Avg = runif(100))
quantpoints <- seq(0.1, 0.9, 0.1)
quants <- quantile(Data$Avg, quantpoints)

cutpoints <- c(-Inf, quants, Inf)

cut(Data$Avg, breaks = cutpoints, labels = seq(1, length(cutpoints) - 1))