Как я могу нормализовать значения столбцов во фрейме данных для всех строк с одинаковым идентификатором, заданным в другом столбце?

У меня есть датафрейм, который выглядит следующим образом

ID  value
1   0.5
1   0.6
1   0.7
2   0.5
2   0.5
2   0.5

и я хотел бы добавить столбец с нормализацией для значений одного и того же идентификатора, например: norm = value/max(значения с одинаковым идентификатором)

ID  value norm
1   0.5   0.5/0.7
1   0.6   0.6/0.7
1   0.7    1
2   0.5    1
2   0.3   0.3/0.5
2   0.5    1

Есть ли простой способ сделать это в R без предварительной сортировки, а затем зацикливания? ура

3 ответа

Решение

Решение с использованием основных инструментов R:

data$norm <- with(data, value / ave(value, ID, FUN = max))

функция ave довольно полезно, и вы можете прочитать ?ave,

Мы можем использовать data.table

library(data.table)
setDT(dt)[, norm := value/max(value), ID]
# Create an example data frame
dt <- read.csv(text = "ID, value
1, 0.5
1, 0.6
1, 0.7
2, 0.5
2, 0.5
               2, 0.5")

# Load package
library(tidyverse)

# Create a new data frame with a column showing normalization
dt2 <- dt %>%
  # Group the ID, make sure the following command works only in each group
  group_by(ID) %>%
  # Create the new column norm 
  # norm equals each value divided by the maximum value of each ID group
  mutate(norm = value/max(value))
Другие вопросы по тегам