Нормализовать данные в столбце 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" подразумевает "упрощение (когда это возможно)".

Другие вопросы по тегам