【问题标题】:`for` loop coercing matrix into large list in R`for`循环将矩阵强制转换为R中的大列表
【发布时间】:2015-11-02 20:22:32
【问题描述】:

我有一个更大的数据集(4352 个观察值),我试图将其分解为连续和离散数据,以便为贝叶斯分析做准备。到目前为止,我已经尝试了两种不同的方法:使用 if-then 语句和 if else,都在 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),并且使用相同向量的索引不起作用。当我尝试时:

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

对不起,如果这是一个愚蠢的问题,但你知道为什么我不能只索引我们之前使用的逆向量吗?

【问题讨论】:

  • 从您的问题中不清楚您的预期输出应该是什么。你能描述一下你希望y.d 包含什么吗?大概是“离散”,你的意思是y的一行只包含1或0?
  • R 版本 3.0.3?当前版本是 3.2.2。可能要先更新。
  • @r3robertson 我需要的一些软件包在任何更新的版本中都无法使用。

标签: r loops if-statement


【解决方案1】:

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

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

【讨论】:

  • 感谢 @joran 解决了第一个问题 - 现在有一个相关的问题,我编辑了我的问题以反映。
  • @Maalthou 试试y.c[as.logical(y.discrete),] &lt;- NA。第一个版本使用了一个微妙的快捷方式,如果您对它们使用布尔运算符,R 将强制 0 和 1 为 FALSE 和 TRUE(在本例中为 !)。
猜你喜欢
  • 1970-01-01
  • 2014-05-15
  • 2015-05-27
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
相关资源
最近更新 更多