【发布时间】: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