0

我有一个包含 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)

}

4

1 回答 1

0

让我们来看看...

foo <- bar[(bar[,2]==2 | bar[,2]==4),1]

应该提取您想要的所有第一列值。然后运行您想要的任何功能,foo可能带有警告“if (length(foo) < 1) then {exit, or skip, or something}”

于 2013-03-22T17:20:54.230 回答