【问题标题】:Nested 'ifelse'-statement for quantiles分位数的嵌套“ifelse”语句
【发布时间】:2016-09-13 12:10:18
【问题描述】:

我正在尝试根据它们在数据框中的分位数为一系列向量分配一个从 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
                   ))}

我得到以下错误:

谁能发现我在这里犯的错误?

【问题讨论】:

  • 尝试使用常规 if 语句而不是 ifelse
  • 有一堆语法错误。例如,Data$quant[1] = 1 应该是1,并且不需要使用for 循环。我会考虑使用cutfindInterval

标签: r if-statement


【解决方案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))

【讨论】:

  • 太棒了。非常好的解决方案,我不知道。非常感谢。我刚刚添加了Data$quant &lt;- cut(Data$Avg, breaks = cutpoints, labels = seq(1, length(cutpoints) - 1)) 以按照我上面的要求将值分配给向量
【解决方案2】:

这应该可行:

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)

【讨论】:

  • 感谢您的回复。我试图尝试第一个解决方案。但是,我在 Data$Quant 中得到纯 3,即使以下测试 &gt; Data$Avg[26]&lt;quants[1] 是“TRUE”
  • @pApaAPPApapapa 没有数据,很难找出问题所在。您可能想dput您的数据以便我对其进行测试。
  • @pApaAPPApapapa 如果它的逻辑没有按预期工作,我会说你的数据中有些东西,或者你的算法逻辑。
猜你喜欢
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2019-08-03
  • 1970-01-01
相关资源
最近更新 更多