【问题标题】:How to flip pairs into X>Y order in R? [closed]如何在R中将对翻转为X> Y顺序? [关闭]
【发布时间】:2016-11-11 15:57:01
【问题描述】:

用户给出一对 id,对应于上三角形中的 id,即 Y > 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)

我仍然不确定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 的 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

【问题讨论】:

  • labbly 真的是一个东西还是一个错字?
  • 谢谢!下次直接自己编辑此类错误。

标签: r data-structures


【解决方案1】:

如果我们假设一个配对点列表,并且您可以相信这些值是有效的(可能不是一个公平的假设,但可以添加防御措施),您似乎可以使用 min 来做到这一点和max

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

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

给予

[[1]]
[1] 10  1

[[2]]
[1] 7 3

[[3]]
[1] 5 4

您可以从向量中获得相同的基本输出,如果您转换为矩阵/data.frame,然后使用相同的函数逐行使用apply。矩阵方法可能类似于:

matData <-
  do.call(rbind, inputData)

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

并给出:

     [,1] [,2]
[1,]   10    1
[2,]    7    3
[3,]    5    4

鉴于更新,我不得不说我同意 @Frank 的观点,即您应该采用我在这里的基本概念,但改用 pmaxpmin。然后函数看起来像这样(注意,我将 xy 设置为参数,因为它们似乎是必需的)。

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

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

cb(plt, x=c(1, 3, 4), y=c(10, 7, 5), rectArgs=list(border="red", lwd=3))

正如预期的那样,有三种方法可以生成所需的对排序,具体取决于它们是出现在对列表、矩阵/data.frame 还是向量中。另一种方法是接受列表或矩阵/data.frame 作为函数的参数,然后使用上面的 lapplyapply 函数并从中提取所需的值。

【讨论】:

  • 对于两个向量 x 和 y 的情况,我猜,cbind(pmax(x,y), pmin(x,y)) 的翻转可能比apply 更有效。
  • 这是paste.ubuntu.com/23461804的作用域,我觉得你的lapply可以加在cb里面。有lst$xlst$y 应该由你的方法单独处理。可以做到吗? - - 我正在考虑如何从c(max(x), min(x))那里传递信息。
猜你喜欢
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
相关资源
最近更新 更多