我有一个包含 3 列的排序列表,我正在搜索第二列是否匹配 2 或 4,如果匹配,则返回第一列的元素,并将其放入函数中。
noOutliers((L1LeanList[order(L1LeanList[,1]),])[(L1LeanList[order(L1LeanList[,1]),2]==2)|
(L1LeanList[order(L1LeanList[,1]),2]==4),1])
当没有任何东西符合条件时。我得到一个
Error in ((L1LeanList[order(L1LeanList[, 1]), ])[1, ])[(L1LeanList[order(L1LeanList[, :
incorrect number of dimensions
由于我们实际上拥有 List[List[all false]]
我不能只分出 L1LLSorted<-(L1LeanList[order(L1LeanList[,1]),] 之类的东西并使用 L1LLSorted[,2] 因为当列表的长度正好为 1 时这会返回错误
所以现在我的代码需要看起来像
noOutliers(ifelse(any((L1LeanList[order(L1LeanList[,1]),2]==2)|
(L1LeanList[order(L1LeanList[,1]),2]==4)),0,
(L1LeanList[order(L1LeanList[,1]),])[(L1LeanList[order(L1LeanList[,1]),2]==2)|
(L1LeanList[order(L1LeanList[,1]),2]==4),1])))
对于我要求的简单事情来说,这似乎有点荒谬。在写这篇文章时,我意识到我最终可以将所有这些错误检查放入 noOutliers 函数本身,所以它看起来像 noOutliers(L1LeanList,2,2,4) 看起来会好得多,这是必要的,因为它的版本略有不同我的代码几十次。我仍然不禁想知道,是否有更优雅的方式来编写实际函数。
对于好奇的人,noOutliers 在排序后的数据集中找到第 30-70 个百分位数的平均值,如下所示
noOutliers<-function(oList)
{
if (length(oList)<=20) return ("insufficient data")
cumSum<-0
iterCount<-0
for(i in round(length(oList)*3/10-.000001):round(length(oList)*7/10+.000001)+1)#adjustments deal with .5->even number rounding r mishandling
{ #and 1-based indexing (ex. for a list 1-10, taking 3-7 cuts off 1,2,8,9,10, imbalanced.)
cumSum<-cumSum+oList[i]
iterCount<-iterCount+1
}
return(cumSum/iterCount)
}