Дублирование строк n раз, где n-значение строки

#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),]
 

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