【发布时间】:2016-09-22 07:47:31
【问题描述】:
我正在尝试检查 data.table 中的每一行是否有某些元素(如果有,我将其声明为 1)。如果有,我想输出一个新列,显示从另一个 data.table 引用的值(元素发生的概率)。
这是输入
structure(list(A = c(0L, 0L, 0L, 0L, 0L), B = c(0L, 0L, 0L, 0L,
0L), C = c(1L, 0L, 1L, 1L, 1L), D = c(0L, 1L, 0L, 0L, 1L)), .Names = c("A",
"B", "C", "D"), class = "data.frame", row.names = c(NA, -5L))
我用来获取概率的表格
Pyxixj 表
A B C D
A 0 0 0 0
B 0 0 0 0
C 0 0 0 0.001804403
D 0 0 0.001804403 0
Pyxi 表
A 0
B 0
C 0.00086701
D 0.000250439
这是输出
A B C D prob
1 0 0 1 0 0.00086701
2 0 0 0 1 0.000250439
3 0 0 1 0 0.00086701
4 0 0 1 0 0.00086701
5 0 0 1 1 0.001804403
我使用下面的 for 循环完成了它,但运行大约 100 万行需要 6 小时。
for (i in 1:nrow(cnts2))
{
if ((rowSums(cnts2 == "1", na.rm = TRUE) == 1)[i])
{
cnts2$prob[i] <- Pyxi[colnames(cnts2)[which(cnts2[i, ] == 1)]]
}
else
{
cnts2$prob[i] <- Pyxixj[colnames(cnts2)[which(cnts2[i, ] == 1)][1], colnames(cnts2)[which(cnts2[i, ] == 1)][2]]
}
}
一直在尝试apply,但我已经想通了。
【问题讨论】:
-
您能否在
Pyxixj和Pyxi的这些子集上使用dput,以便更容易重现它们? -
想要的人的数据
cnts2<-matrix(c(0,0,1,0, 0,0,0,1, 0,0,1,0, 0,0,1,0, 0,0,1,1), nrow=5,ncol=4,byrow=TRUE) colnames(cnts2)<-c("A","B","C","D") cnts2<-as.data.frame(cnts2) Pyxixj<-matrix(c(0,0,0,0, 0,0,0,0, 0,0,0,0.001804403, 0,0,0.001804403,0), nrow=4,ncol=4,byrow=TRUE) colnames(Pyxixj)<-c("A","B","C","D") rownames(Pyxixj)<-c("A","B","C","D") Pyxi<-matrix(c(0,0,0.00086701,0.000250439),nrow=4) rownames(Pyxi)<-c("A","B","C","D") -
你试过用 ForEach 并行运行吗?
-
另请参阅这篇文章,了解如何使用 apply():stackoverflow.com/questions/23980984/…