如何在R中将对转换为X> Y顺序?

时间:2016-11-11 15:57:02

标签: r data-structures

用户给出对应于上三角形中的ids的对,即当Y> 0时。 X。 我在想如何处理这些点以及这里最好的数据结构。 我认为拥有像(x1,y1), (y3,x3), ...这样的对是直观的,但更好的可以是c(x1,x2,x3,...), c(y1,y2,y3, ...),但那只是关于翻转问题。 示例输入

  1. (10,1),(7,3),(5,4) - 返回相同的
  2. (1,10),(7,3),(5,4) - 返回(10,1),(7,3),(5,4)
  3. (1,10),(7,3),(4,5) - 返回(10,1),(7,3),(5,4)
  4. 我仍然不确定id.pairs或者是

    中的数据结构的伪代码
      lapply(id.pairs,function(z){
        x <- z$V1
        y <- z$V2
        ...
      })
    
     # not sure if possible
     lapply({x.points, y.points}, function(z){
        x <- z$V1
        y <- z$V2
        ...
      })
    

    动机:为上三角形中的以下函数提供正确的点

    # https://stackoverflow.com/q/40538304/54964
    cb(plt, x=c(10, 7, 5), y=c(1, 3, 4), rectArgs=list(border="red", lwd=3))
    

    测试MarkPeterson&#39; proposal

    我认为他的第一种方法可行,但我正在考虑如何将他的lapply应用于参数xleftybottom

    # Complete test code http://paste.ubuntu.com/23461804/
    # Chat of https://stackoverflow.com/q/40538304/54964 user20650
    cb <- function(corrPlot, ..., rectArgs = list() ){ 
                    lst <- list(...) 
                    lapply({x,y}, function(x){
                      c(max(x), min(x))
                    })
    
                    xleft <- match(lst$x, colnames(corrPlot)) - 0.5
                    ybottom <- n - match(lst$y, colnames(corrPlot)) + 0.5
    }
    

    R:3.3.1
    操作系统:Debian 8.5

1 个答案:

答案 0 :(得分:1)

如果我们假设一个配对点列表,并且您可以信任这些值是有效的(可能不是公平的假设,但可以添加防御),那么您似乎可以用{{1 }和min

max

给出

inputData <-
  list(
    c(1,10)
    , c(7,3)
    , c(4,5)
  )

lapply(inputData, function(x){
  c(max(x), min(x))
})

如果转换为矩阵/ data.frame,则可以从向量获得相同的基本输出,然后使用具有相同函数的行[[1]] [1] 10 1 [[2]] [1] 7 3 [[3]] [1] 5 4 。矩阵方法可能看起来像:

apply

并给出:

matData <-
  do.call(rbind, inputData)

t(apply(matData, 1, function(x){
  c(max(x), min(x))
}))

鉴于更新,我不得不说我同意@Frank您应该对我在这里所拥有的内容有基本的了解,但请改用 [,1] [,2] [1,] 10 1 [2,] 7 3 [3,] 5 4 pmax。然后该函数看起来像这样(注意,我将pminx设置为参数,因为它们似乎是必需的。)

y

然后,这似乎按预期工作:

cb <- function(corrPlot, x, y, rectArgs = list() ){ 
  # ... pass named vector of x and y names 
  # for upper x > y, lower x < y 
  useX <- pmax(x, y)
  useY <- pmin(x,y)

  n <- ncol(corrPlot)
  nms <- colnames(corrPlot)
  colnames(corrPlot) <- if(is.null(nms)) 1:ncol(corrPlot) else nms

  xleft <- match(useX, colnames(corrPlot)) - 0.5
  ybottom <- n - match(useY, colnames(corrPlot)) + 0.5

  lst <- list(xleft=xleft, ybottom=ybottom, xright=xleft+1, ytop=ybottom+1) 
  do.call(rect, c(lst, rectArgs))
}

正如预期的那样,有三种方法可以生成所需的对排序,具体取决于它们是否出现在对列表,矩阵/数据框架或向量中。另一种方法是接受列表或矩阵/ data.frame作为函数的参数,然后使用上面的cb(plt, x=c(1, 3, 4), y=c(10, 7, 5), rectArgs=list(border="red", lwd=3)) lapply函数并从中提取所需的值。