我想估计一行中除对角线以外分布的值的比率。但是,我无法使函数正常工作。
一个假设的数据看起来像:
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
建议会很棒吗?
答案 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