Нормализовать данные для каждой строки в R

#r #dataframe #ggplot2 #boxplot #normalize

#r #dataframe #ggplot2 #boxplot #нормализовать

Вопрос:

Как я могу масштабировать / нормализовать свои данные для каждой строки (наблюдения)? Что-то вроде [-1: 1], как оценка z?

Я видел предыдущий пост, который включает нормализацию всего набора данных следующим образом https://stats.stackexchange.com/questions/178626/how-to-normalize-data-between-1-and-1 , но я хотел бы нормализовать каждую строку, чтобы их можно было отобразить на одном прямоугольном графике, поскольку все они показывают одинаковый шаблон по оси x.

 Obs <- c("A", "B", "C")
count1 <- c(100,15,3)
count2 <- c(250, 30, 5)
count3 <- c(290, 20, 8)
count4<- c(80,12, 2 )
df <- data.frame(Obs, count1, count2, count3, count4)
dff<- df %>% pivot_longer(cols = !Obs, names_to = 'count', values_to = 'Value') 
ggplot(dff, aes(x = count, y = Value))  
    geom_jitter(alpha = 0.1, color = "tomato")   
    geom_boxplot()
 

введите описание изображения здесь

Ответ №1:

На основе ссылки, которой вы поделились, вы можете использовать apply соответствующую функцию для масштабирования dataframe поверх [-1,1] .

 library(scales)
library(ggplot2)
library(tidyr)

Obs <- c("A", "B", "C")
count1 <- c(100,15,3)
count2 <- c(250, 30, 5)
count3 <- c(290, 20, 8)
count4<- c(80,12, 2 )

df <- data.frame(count1, count2, count3, count4)

df <- as.data.frame(t(apply(df, 1, function(x)(2*(x-min(x))/(max(x)-min(x)))- 1)))

df <- cbind(Obs, df)

dff<- df %>% 
       tidyr::pivot_longer(cols = !Obs, names_to = 'count', values_to = 'Value') 


ggplot(dff, aes(x = count, y = Value))  
     geom_jitter(alpha = 0.1, color = "tomato")   
     geom_boxplot()


 

Вывод на консоль:

введите описание изображения здесь

Ответ №2:

Если вы поворачиваете его дольше, вы можете группировать по своим наблюдениям и масштабировать:

 df %>% 
pivot_longer(cols = !Obs, names_to = 'count', values_to = 'Value') %>% group_by(Obs) %>% 
mutate(z=as.numeric(scale(Value))) %>% 
ggplot(aes(x=count,y=z)) geom_boxplot()
 

введите описание изображения здесь

Или в базовом R, просто сделайте:

 boxplot(t(scale(t(df[,-1]))))
 

введите описание изображения здесь