Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.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_Matrix - Fatal编程技术网

R 检查矩阵行中的每两个相邻元素

R 检查矩阵行中的每两个相邻元素,r,matrix,R,Matrix,我对R编码还不熟悉,也许我的问题太简单了 我有一个299*5992维的矩阵“数据”。每个元素为A1或A2 所以我想集中矩阵的信息如下: XD=matrix(,dim(data)[1],(dim(data)[2])/2 ) for ( i in dim(XD)[1]) { for (j in dim(XD)[2]) { if (data[i,2*j]==data[i,2*j-1]) {XD[i,j]=-1} else {XD[i,j]=1 } }

我对R编码还不熟悉,也许我的问题太简单了

我有一个299*5992维的矩阵“数据”。每个元素为A1或A2 所以我想集中矩阵的信息如下:

XD=matrix(,dim(data)[1],(dim(data)[2])/2 )
for ( i in dim(XD)[1])
{
  for (j in dim(XD)[2])
  {
    if (data[i,2*j]==data[i,2*j-1])
    {XD[i,j]=-1}
    else
    {XD[i,j]=1
    }
  }
}  
所以我有两个问题:

  • 如何更有效地做到这一点
  • 当我调用像XD[1,1]这样的元素时,我得到NA,即使我是 确保矩阵数据已正确加载

  • 这是一种只有一个
    sapply
    循环的方法

    编一些数据

    set.seed(1234)
    data <- matrix(sample(c("A1", "A2"), 96, TRUE), 8)
    

    以下是两种方法:

    • 解决方案1(我认为这是比后者更有效的解决方案)
    您可以先通过比较两个相邻列来获取逻辑值,然后将其塑造成所需的矩阵,其中使用
    ifelse

    M <- matrix(ifelse(data[,seq(ncol(data))%%2==1]==data[,seq(ncol(data))%%2==0],-1,1),
                nrow = nrow(data))
    
    • 解决方案2
    除了使用解决方案外,您还可以使用
    sapply
    以及
    split.default
    data.frame
    ,如下所示

    M <- sapply(split.default(data.frame(data,stringsAsFactors = F),rep(1:(dim(data)[2]/2),1,each=2)),
                              function(v) ifelse(v[1]==v[2],-1,1))
    
    数据

    set.seed(1)
    data <- matrix(sample(c("A1", "A2"), 128, TRUE), 4)
    
    set.seed(1)
    
    你根本没有循环的数据,
    i
    j
    都只取一个值,
    dim(data)[.]
    。所以问题是:如果两个相邻的值在行上相等,
    XD[i,j]
    
    M <- sapply(split.default(data.frame(data,stringsAsFactors = F),rep(1:(dim(data)[2]/2),1,each=2)),
                              function(v) ifelse(v[1]==v[2],-1,1))
    
    > M
          1  2  3  4 5  6  7  8  9 10 11 12 13 14 15 16
    [1,]  1  1  1 -1 1 -1  1  1 -1  1  1  1  1 -1  1 -1
    [2,]  1  1  1  1 1 -1  1 -1 -1 -1 -1 -1 -1 -1  1  1
    [3,] -1 -1  1 -1 1  1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1
    [4,] -1  1 -1  1 1 -1 -1  1  1 -1  1 -1 -1  1 -1  1
    
    set.seed(1)
    data <- matrix(sample(c("A1", "A2"), 128, TRUE), 4)