估计矩阵中各行的不匹配率

时间:2018-11-15 15:54:40

标签: r function matrix

我想估计一行中除对角线以外分布的值的比率。但是,我无法使函数正常工作。

一个假设的数据看起来像:

tree = data.frame(Oak = c(10,1,3), Pine = c(2,15,1), Maple = c(1,1,20), 
+                   row.names = c("Oak","Pine","Maple"))
> tree 
         Oak Pine Maple
  Oak     10    2     1
  Pine     1   15     1
  Maple    3    1    20

对于Oak来说,我想得到一个值:(2 +1)/(10 + 2 +1)= 0.2308,这是“在行名和列名不同的情况下取值” /“行总和”

我还想对所有列重复此操作。我认为写下一个函数,特别是对于大型真实数据集会更好。

所以我想到了这个功能:

miss.rate = function(data) {
rate.x = sum(data[(data["i",] != data[,"i"]),])/
(sum(data["i",]))
data.frame(tree = "i", rate  = rate.x)
}

但是,它没有按我预期的那样工作,我也不知道哪里出了问题。

该函数的预期输出为:

tree  rate
Oak   0.2308
Pine  0.1176
Maple 0.1667

建议会很棒吗?

2 个答案:

答案 0 :(得分:2)

或单线:

1 - diag(as.matrix(tree)) / rowSums(tree)
#       Oak      Pine     Maple 
# 0.2307692 0.1176471 0.1666667

答案 1 :(得分:0)

t(
sapply(seq_along(tree), function(x) { data.frame(tree = I(names(tree)[x]), rate = sum(tree[x,-x]) / sum(tree[x,])) })
)

#     tree    rate     
#[1,] "Oak"   0.2307692
#[2,] "Pine"  0.1176471
#[3,] "Maple" 0.1666667