#r #repeat
Вопрос:
У меня есть набор данных, в котором я перечисляю штаты с их соответствующими городами, некоторые из этих мест были объединены (не мной) и классифицированы как "Other ([count of places])" (e.g. Other (99))
. К этому списку мест добавляются числовые 'count'
значения. Я хотел бы 1.) найти среднее количество на место и 2.) продублировать эти «Другие…» места вместе со средним значением в соответствии с числом в круглых скобках. Пример ниже:
set.seed(5)
df <- data.frame(state = c('A','B'), city = c('Other (3)','Other (2)'), count = c('250','50'))
Выход:
государство | город | считать |
---|---|---|
A | Другое (3) | 83.333 |
A | Другое (3) | 83.333 |
A | Другое (3) | 83.333 |
B | Другое (2) | 25.000 |
B | Другое (2) | 25.000 |
До сих пор мне удавалось только понять, как извлечь числа из скобок и создать среднее значение:
average = df$count/as.numeric(gsub(".*\((.*)\).*", "\1", df$city))
Ответ №1:
Вариант с uncount
. Извлеките числовую часть в «городе» с parse_number
помощью , разделите «количество» на » n » и повторите строки с помощью uncount
library(dplyr)
library(tidyr)
df %>%
mutate(n = readr::parse_number(city), count = as.numeric(count)/n) %>%
uncount(n)
-выход
state city count
1 A Other (3) 83.33333
2 A Other (3) 83.33333
3 A Other (3) 83.33333
4 B Other (2) 25.00000
5 B Other (2) 25.00000
Ответ №2:
Вы могли бы расширить свой пример с помощью следующего кода:
set.seed(5)
df <- data.frame(state = c('A','B'), city = c('Other (3)','Other (2)'), count = c('250','50'))
times <- as.numeric(gsub(".*\((.*)\).*", "\1", df$city))
df$count <- as.numeric(df$count)/times
output <- df[rep(seq_along(times),times),]
Ключевым дополнением является вывод для создания строк, который использует индексацию строк во входном фрейме данных для повторения каждой строки по мере необходимости.