从预先存在的变量计算具有多个可能结果的新矩阵

时间:2014-01-31 16:44:47

标签: r matrix calculated-columns

我需要覆盖两个大矩阵(或来自两者的合并的列)以生成用于分析的最终矩阵。我有一系列的点数,每年计算3次,持续数年(产生例如计数2000_1,2000_2等),但有时因某种原因没有做到这一点。如果这一点已经完成,则可能存在检测结果,或者可能没有检测结果。因此,最终矩阵中的每个单元基本上有三种可能的结果可以从其他两个值计算出来。如果在某个时刻没有发生采样,我需要值“。”;如果发生采样但没有发现检测,我需要一个“0”,如果发生采样并且检测到1-n个体,我需要一个“1”。

在下面的示例数据中,我将两个矩阵组合起来进行简化,但请注意,实际数据集将是64列以上的大约750个记录。在第1列中,提供了点ID。接下来的5列(pt.x)提供是否在给定的year_rotation中进行计数,以及最后5列(如果有任何检测)。 NA不是数据,只应在未发生采样时发生,但如果存在采样但未输入零则可能发生。

样品

Point <- c(“A194”,” A234”,”A83”,” K37”,” TS47”)
p0.1 <- c(1,1,1,1,0)
p0.2 <- c(1,1,1,1,0)
p0.3 <- c(1,1,1,1,0)
p1.1 <- c(1,0,1,0,0)
p1.2 <- c(1,0,1,1,0)
d0.1 <- c(1,0,0,3,NA)
d0.2 <- c(0,0,2,2,NA)
d0.3 <- c(0,0,0,1,NA)
d1.1 <- c(0,NA,0,NA,NA)
d1.2 <- c(0,NA,0,0,NA)

以下是我最终想要的结果:

Point f0.1 f0.2 f0.3 f1.1 f1.2
A194    1    0    0    0    0
A234    0    0    0    .    .
A83    0    1    1    0    0
K37    1    1    1    .    1
TS47    .    .    .    .    .

任何人都可以提出一个干净,通用的方法来做到这一点,以便它可以转移到更大的数据集,或最终转移到其他类似的数据集?我可以从这个场景开始,在相同的数据帧中使用点和检测(上面的p和d列),或者使用两个帧,每个条件一个。 感谢您的帮助,如果我的帖子中存在格式问题,请对不起。相对较新的格式化。

1 个答案:

答案 0 :(得分:0)

我不确定你是如何得出你的结果的:

  • 为什么需要p*向量?
  • 为什么f1.2为0。 0 1。?你怎么得到最后一个?

这是我的尝试(基于我从你的问题中所理解的):

Point <- c("A194","A234","A83","K37","TS47")
d0.1 <- c(1,0,0,3,NA)
d0.2 <- c(0,0,2,2,NA)
d0.3 <- c(0,0,0,1,NA)
d1.1 <- c(0,NA,0,NA,NA)
d1.2 <- c(0,NA,0,0,NA)

#create this matrix from whatever you start with
d <- ls(pattern="d\\d+\\.\\d+")
m <- do.call(cbind, mget(d))
rownames(m) <- Point

res <- (m>0)+0
colnames(res) <- gsub("d", "f", d)

我认为您要将NA值打印为.?我不明白你为什么要这样,但这实现了它:

#create a class with a print method that prints NA as .
class(res) <- c("myclass", class(res))
print.myclass <- function(x) {
  x[is.na(x)] <- "."
  print.data.frame(as.data.frame(x))
}

res
#      f0.1 f0.2 f0.3 f1.1 f1.2
# A194    1    0    0    0    0
# A234    0    0    0    .    .
# A83     0    1    0    0    0
# K37     1    1    1    .    0
# TS47    .    .    .    .    .