Оценка несоответствия по строкам в матрице - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу оценить показатели значений, распределенных отдельно от диагонали подряд.Однако я не смог заставить свою функцию работать.

Итак, гипотетические данные выглядят так:

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

Допустим, для Дуба я хочу получить значение: (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 голосов
/ 15 ноября 2018

Или однострочник:

1 - diag(as.matrix(tree)) / rowSums(tree)
#       Oak      Pine     Maple 
# 0.2307692 0.1176471 0.1666667
0 голосов
/ 15 ноября 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...