Как мне повторить строки во фрейме данных И добавить поле приращения? - PullRequest
0 голосов
/ 07 октября 2018

Я нашел много ответов о том, как дублировать записи, но я также хочу добавить поле приращения к каждой из дублированных записей.Я нашел похожий вопрос, но у них нет поля startValue: Повтор строк в кадре данных на основе значений в определенном столбце .

Мой кадр данных начинается с

df <-
  data startValue freq
    a        3.4    3
    b        2.1    2
    c        6.3    1

Я хочу этот вывод

df.expanded <-
    data startValue value
       a        3.4     3
       a        3.4     4
       a        3.4     5
       b        2.1     2
       b        2.1     3
       c        6.3     6

Я нашел способ сделать это, но я хотел бы что-то более простое, которое будет хорошо работать на больших наборах данных.Вот что я сделал, чтобы это работало.

df <- data.frame(data = c("a", "b", "c"),
                 startValue = c(3.4, 2.1, 6.3),
                 freq = c(3,2,1))
df

# find the largest integer that I will need as an index.
n <- floor(max(df$startValue + df$freq))-1

# repeat each df record n times. Only the record with the
# largest startValue + freq needs to be repeated this many
# times, but I am repeating everything this many times.
df.expanded <- df[rep(row.names(df), each = n), ]

# Use recycling to fill a new column. Now I have created
# a Cartesian product. If n is 46, records with a
# freq of 46 are repeated just the right number of times.
# but records with a freq of 2 are repeated many more times
# than is needed.
df.expanded$value <- 1:n

# finally, I filter out all the extra repeats that I didn't need.
df.expanded <-
df.expanded[df.expanded$value >= floor(df.expanded$startValue)
            & df.expanded$value < floor(df.expanded$startValue+df.expanded$freq),]
df.expanded[-3]

Есть ли способ, который будет лучше работать с большими наборами данных?Большинству записей требуется менее 5 повторов, но некоторым нужно 50 повторений.Мне не нравится идея повторять все 50 раз, когда только 1 из 10000 записей нуждаются в больших повторениях.Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Я не знаю, почему вы этого хотите, но используете tidyverse:

df %>% 
  mutate(value = map(freq,~.:(2*.-1))) %>% 
  unnest %>%
  select(-freq)
#   data startValue value
# 1    a        3.4     3
# 2    a        3.4     4
# 3    a        3.4     5
# 4    b        2.1     2
# 5    b        2.1     3
# 6    c        6.3     1
0 голосов
/ 07 октября 2018

Вы можете использовать uncount из tidyr

library(dplyr)
library(tidyr)

df %>%
  uncount(weights = freq, .id = "n", .remove = F) %>%
  mutate(value = freq + n - 1)

  data startValue freq n value
1    a        3.4    3 1     3
2    a        3.4    3 2     4
3    a        3.4    3 3     5
4    b        2.1    2 1     2
5    b        2.1    2 2     3
6    c        6.3    1 1     1
...