2016-09-13 242 views
0

我试图从1到10分配一个数字给一系列基于它们在数据框中的分位数的向量。分位数的嵌套'ifelse'语句

到目前为止,我已经尝试

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 
        ))} 

我收到以下错误:

enter image description here

谁能发现我在这里做了错误?

+0

尝试使用常规的if语句,而不是'ifelse' –

+0

还有一堆语法错误。例如,'Data $ quant [1] = 1'应该是'1',并且使用'for'循环是不必要的。我会考虑使用'cut'或'findInterval'。 – lmo

回答

1

你可能会使用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)) 
+0

太棒了。非常好的解决方案,我不知道。非常感谢。我刚刚添加了'Data $ quant < - cut(Data $ Avg,breaks = cutpoints,labels = seq(1,length(cutpoints) - 1))'按照我上面的要求将值赋给vector – pApaAPPApapapa

1

这应该工作:

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)) 
} 

或等价(该for循环内):

if(Data$Avg [i] < quants[1]) 
    Data$quant[1] <- 1 
else{ 
    if(Data$Avg [i] > quants[1] & Data$Avg[i] < quants[2]) 
     Data$quant[1] <- 2 
    else 
     Data$quant[1] <- 3 
} 

你应该分配的ifelse条件的输出在它之外。那就是:

output <- ifelse(a > b, a, b) 
+0

感谢您的回应。我试图尝试第一个解决方案。然而,即使在没有数据的情况下,以下测试'> Data $ Avg [26] pApaAPPApapapa

+0

@pApaAPPApapapa,我在Data $ Quant中获得纯3,因此很难找出问题。您可能需要“输入”您的数据,以便我进行测试。 – 989

+0

@pApaAPPApapapa如果它的逻辑不能按预期工作,那么数据中就会有某些东西,我会说或者算法逻辑。 – 989