`for`循环将矩阵强制转换为R

时间:2015-11-02 20:22:33

标签: r loops if-statement

我有一个更大的数据集(4352个观测值)我试图将其分解为连续和离散数据以准备贝叶斯分析。到目前为止,我尝试了两种不同的方法:在if else循环内使用if-then语句和for

我的观察结果是对象y中的比例:

> head(y,10)  
     A   B    C DEF  
1  0.50 0.5 0.00 0.0  
2  0.95 0.0 0.05 0.0  
3  0.10 0.0 0.00 0.9  
4  0.70 0.0 0.30 0.0  
5  0.95 0.0 0.05 0.0  
6  0.60 0.0 0.40 0.0
7  0.95 0.00 0.05 0.0
8  0.95 0.05 0.00 0.0
9  1.00 0.00 0.00 0.0
10 1.00 0.00 0.00 0.0

长度为y的向量,我稍后会用它来索引行是离散的(0,1)还是连续的。

y.discrete <- rep(0,dim(y)[1])

我的第一个方法是if-then语句:

y.d <- matrix(NA,n,ncat)

for (i in 1:n){
y.d[i,][max(y[i,])==1]=y[i,]
y.discrete[i][!is.na(y.d[i,])]=1
}

for循环产生Error in y.d[i, 1] : incorrect number of dimensions。如果在if-then语句中调出一个单独的元素(例如y.d[i,1]),那么它会运行而不会出错。此外,一旦循环运行,对象y.d将从矩阵更改为大列表。我相信这是造成维度数量错误的原因。如果你在这里看i,那就是1。

我还试过if else

y.d <- matrix(NA,n,4)

for (i in 1:n){
  if (max(y[i,])==1) {
    y.d[i,]<-y[i,]    
  } else {
    if (!is.na(y.d[i,1])) {
      y.discrete[i]<-1
    } 
  }
}

这为循环提供了相同的错误,但是如果你查看i的最后一个值,它就是10.这仍然存在更改类的问题。

有没有人对这里发生的事情有任何想法?我已经向两位同事求助了,我们都很难过。我感谢您的帮助。我在Windows 7,64位计算机上运行R 3.0.3。

编辑:为了澄清,我希望y.d包含来自y的相应行,其中一个值(A,B,C,DEF)正好等于1.否则,它应保持NA。

编辑2: 我一直试图得到@joran提供的答案的倒数来进行连续观察(其中值介于 - 但不包含 - 0,1),并且使用相同的向量进行索引不是&#39工作。当我尝试:

y.c<-y
y.c[y.discrete,] <- NA

我的数据中仍然有1行的行(请参阅第9行和第10行),它与y.d传递的内容不相反:

> head(y.d,10)
    A  B  C DEF
1  NA NA NA  NA
2  NA NA NA  NA
3  NA NA NA  NA
4  NA NA NA  NA
5  NA NA NA  NA
6  NA NA NA  NA
7  NA NA NA  NA
8  NA NA NA  NA
9   1  0  0   0
10  1  0  0   0

> head(y.c, 10)
      A    B    C DEF
1    NA   NA   NA  NA
2  0.95 0.00 0.05 0.0
3  0.10 0.00 0.00 0.9
4  0.70 0.00 0.30 0.0
5  0.95 0.00 0.05 0.0
6  0.60 0.00 0.40 0.0
7  0.95 0.00 0.05 0.0
8  0.95 0.05 0.00 0.0
9  1.00 0.00 0.00 0.0
10 1.00 0.00 0.00 0.0

很抱歉,如果这是一个愚蠢的问题,但是你知道为什么我不能仅为我们使用之前的倒数的向量编制索引吗?

1 个答案:

答案 0 :(得分:0)

我在这里猜测,因为你的问题遗漏了一些细节。我认为你实际上要做的是这样的事情:

y.discrete <- apply(y,1,function(x) as.integer(any(x == 1)))
> y.discrete
 1  2  3  4  5  6  7  8  9 10 
 0  0  0  0  0  0  0  0  1  1 

然后:

> y.d <- y
> y.d[!y.discrete,] <- NA
> y.d
    A  B  C DEF
1  NA NA NA  NA
2  NA NA NA  NA
3  NA NA NA  NA
4  NA NA NA  NA
5  NA NA NA  NA
6  NA NA NA  NA
7  NA NA NA  NA
8  NA NA NA  NA
9   1  0  0   0
10  1  0  0   0