#r
#r
Вопрос:
У меня есть матрица вероятности, которая выглядит следующим образом:
ID V1 V2 V3 V4
1 0.15 0.1 0.5 0.25
2. 0 0.1 0.3. 0.6
3. 0.2. 0.25. 0.2. 0.35
Я хотел бы преобразовать ее в матрицу 1, 0 с наибольшей вероятностью, присвоенной 1, а остальным — 0:
ID V1 V2 V3 V4
1 0 0 1 0
2. 0 0. 0. 1
3. 0. 0 0 1
Как мне написать функцию для выполнения задачи?
Комментарии:
1. Есть ли у ваших фактических данных несколько
.
в одном поле, например0.2.
, или это просто числа, подобные0.2
?
Ответ №1:
Если это по строке, то мы получаем max
значение с pmax
и проводим сравнение с набором данных
df1[-1] <- (df1[-1] == do.call(pmax, df1[-1]))
df1
# ID V1 V2 V3 V4
#1 1 0 0 1 0
#2 2 0 0 0 1
#3 3 0 0 0 1
Или с apply
df1[-1] <- t(apply(df1[-1], 1, function(x) (x == max(x))))
данные
df1 <- structure(list(ID = c(1, 2, 3), V1 = c("0.15", "0", "0.2."),
V2 = c("0.1", "0.1", "0.25."), V3 = c("0.5", "0.3.", "0.2."
), V4 = c(0.25, 0.6, 0.35)), class = "data.frame",
row.names = c(NA,
-3L))
Ответ №2:
Мы можем использовать max.col
который возвращает индекс максимального значения в каждой строке.
#Create a copy of df
df2 <- df
#turn all values to 0
df2[-1] <- 0
#Get the max column number in each row and turn those values to 1
df2[cbind(1:nrow(df), max.col(df[-1]) 1)] <- 1
df2
# ID V1 V2 V3 V4
#1 1 0 0 1 0
#2 2 0 0 0 1
#3 3 0 0 0 1
данные
df <- structure(list(ID = 1:3, V1 = c(0.15, 0, 0.2), V2 = c(0.1, 0.1,
0.25), V3 = c(0.5, 0.3, 0.2), V4 = c(0.25, 0.6, 0.35)),
class = "data.frame", row.names = c(NA, -3L))