Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 抓取较低三角形中的三角形_R - Fatal编程技术网

R 抓取较低三角形中的三角形

R 抓取较低三角形中的三角形,r,R,我需要抓取构成对称矩阵下三角的所有三元素三角形。我想不出如何按照最左边一列向下,然后下一列向右的顺序抓取所有这些片段,以此类推。我知道下三角形内部的小三角形的数量是: n = x(x - 1)/2 where: x = nrow(mats[[i]]) 在这里,我创建了三个带有字母的矩阵(我更容易用这种方式进行概念化)以及我要查找的顺序中的元素: FUN <- function(n) { matrix(LETTERS[1:(n*n)], n) } mats <- lappl

我需要抓取构成对称矩阵下三角的所有三元素三角形。我想不出如何按照最左边一列向下,然后下一列向右的顺序抓取所有这些片段,以此类推。我知道下三角形内部的小三角形的数量是:

n = x(x - 1)/2
where: x = nrow(mats[[i]])
在这里,我创建了三个带有字母的矩阵(我更容易用这种方式进行概念化)以及我要查找的顺序中的元素:

FUN <- function(n) {
    matrix(LETTERS[1:(n*n)], n)
}

mats <- lapply(3:5, FUN)
在R基地,我如何以最快的方式完成这项任务

不确定我所追求的视觉效果是否有用,但可能是:


好问题!下面是如何使用一点递归(后面是一个更简单的版本)来解决它

它的格式将与您要求的相同


这里有一个更简单的版本(忘记递归吧!)


get.triangles编辑后添加了一个
SIMPLIFY=FALSE
,现在它正好提供了您想要的:

基本上,此方法获取所需三角形的所有左上角的索引,然后获取[cell below]+[cell below+to right]。激动此方法的另一个好处是,它适用于
矩阵
数据.frame
对象

bot.tris <- function(data) {
  idx1 <- unlist(sapply((nrow(data)-2):1,function(x) tail(2:(nrow(data)-1),x)))
  idx2 <- rep(1:(nrow(data)-2),(nrow(data)-2):1)
  mapply(function(x,y) {c(data[x,y],data[x+1,y],data[x+1,y+1])},idx1,idx2,SIMPLIFY=FALSE)
}

bot.tris非常感谢您的帮助。我将使用不带递归的方法,因为不需要使用
strsplit
(如果它是数值矩阵,则不需要使用
作为.numeric
)+1这种方法显然较少编码,而且非常容易理解。我对两种反应进行了基准测试,flodel的反应更快。这里的两个函数都比我拥有的(没有)快。非常感谢你解决这个问题+1“这里的两个函数都比我拥有的要快(什么都没有)”-我喜欢:-)5x5矩阵是你期望要测试的最大的矩阵吗?不,它可能更大(尽管我非常怀疑它会更大)。@Tylerinker-我只是在尝试对10K*10K矩阵进行基准测试时被迫关闭了R会话。1K*1K只需几秒钟。我想知道那里的人们是否有更高效的实现。
triangle <- function(base.idx, mat) {
    upper.idx <- base.idx - 1L
    right.idx <- base.idx + nrow(mat)
    paste(mat[c(upper.idx, base.idx, right.idx)], collapse = " ")
}

get.triangles <- function(mat) {
    N <- nrow(mat)
    if (N == 3L) {
        return(triangle(3L, mat))
    } else {
        left.idx  <- 3:N
        right.mat <- mat[2:N, 2:N]
        left.triangles  <- sapply(left.idx, triangle, mat)
        right.triangles <- Recall(right.mat) 
        return(c(left.triangles, right.triangles))
    }
}

x <- lapply(mats, get.triangles)

# [[1]]
# [1] "B C F"
# 
# [[2]]
# [1] "B C G" "C D H" "G H L"
# 
# [[3]]
# [1] "B C H" "C D I" "D E J" "H I N" "I J O" "N O T"
lapply(x, strsplit, split = " ")
get.triangles <- function(mat) {
    base.idx  <- seq_along(mat)[row(mat) > col(mat) + 1]
    upper.idx <- base.idx - 1L
    right.idx <- base.idx + nrow(mat)

    lapply(mapply(c, upper.idx, base.idx, right.idx, SIMPLIFY = FALSE),
           function(i)mat[i])
}
bot.tris <- function(data) {
  idx1 <- unlist(sapply((nrow(data)-2):1,function(x) tail(2:(nrow(data)-1),x)))
  idx2 <- rep(1:(nrow(data)-2),(nrow(data)-2):1)
  mapply(function(x,y) {c(data[x,y],data[x+1,y],data[x+1,y+1])},idx1,idx2,SIMPLIFY=FALSE)
}
> result <- lapply(mats,bot.tris)
> str(result)
List of 3
 $ :List of 1
  ..$ : chr [1:3] "B" "C" "F"
 $ :List of 3
  ..$ : chr [1:3] "B" "C" "G"
  ..$ : chr [1:3] "C" "D" "H"
  ..$ : chr [1:3] "G" "H" "L"
 $ :List of 6
  ..$ : chr [1:3] "B" "C" "H"
  ..$ : chr [1:3] "C" "D" "I"
  ..$ : chr [1:3] "D" "E" "J"
  ..$ : chr [1:3] "H" "I" "N"
  ..$ : chr [1:3] "I" "J" "O"
  ..$ : chr [1:3] "N" "O" "T"