Нормализовать данные в столбце R data.frame
Предположим, у меня есть следующие данные:
a <- data.frame(var1=letters,var2=runif(26))
Предположим, я хочу масштабировать каждое значение в var2
такой, что сумма var2
столбец равен 1 (по сути, превращает столбец var2 в распределение вероятностей)
Я пробовал следующее:
a$var2 <- lapply(a$var2,function(x) (x-min(a$var2))/(max(a$var2)-min(a$var2)))
это не только дает общую сумму больше 1, но и поворачивает var2
столбец в список, в котором я не могу делать такие операции, как sum
Есть ли действительный способ превратить этот столбец в распределение вероятностей?
1 ответ
Предположим, у вас есть вектор x
с неотрицательными значениями и нет NA
Вы можете нормализовать это
x / sum(x)
которая является правильной функцией вероятности массы.
Преобразование вы берете:
(x - min(x)) / (max(x) - min(x))
только перепродажи x
на [0, 1]
, но не обеспечивает "суммирование до 1".
Относительно вашего кода
Там нет необходимости использовать lapply
Вот:
lapply(a$var2, function(x) (x-min(a$var2)) / (max(a$var2) - min(a$var2)))
Просто используйте векторизованную операцию
a$var2 <- with(a, (var2 - min(var2)) / (max(var2) - min(var2)))
Как вы сказали, lapply
дает вам список, и это то, что "l" в "lapply" относится к. Ты можешь использовать unlist
свернуть этот список в вектор; или вы можете использовать sapply
где "s" подразумевает "упрощение (когда это возможно)".