Как мне повторить последнюю строку кадра данных n раз, меняя 1 или 2 переменные? - PullRequest
3 голосов
/ 26 мая 2020

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

> df <- data.frame(Year = c(2000,2001,2002), Age = c(0,1,2), x = c(1,2,3), y = c(0.3,0.7,0.5))
> df
  Year Age x   y
1 2000   0 1 0.3
2 2001   1 2 0.7
3 2002   2 3 0.5

Я хочу повторить последнюю строку, скажем, 3 раза, увеличивая при этом значение года и возраста на 1 для каждую новую строку, которую я создаю, например:

> df2
  Year Age x   y
1 2000   0 1 0.3
2 2001   1 2 0.7
3 2002   2 3 0.5
4 2003   3 3 0.5
5 2004   4 3 0.5
6 2005   5 3 0.5

В основном увеличивая значение Year и Age, но позволяя x и y оставаться постоянными.

Ответы [ 4 ]

4 голосов
/ 26 мая 2020

Вы можете повторить номер последней строки n раз и добавить seq(n) в Age, чтобы увеличить его на 1, т.е.

rbind(df, transform(df[rep(nrow(df), 3),], Age = Age + seq(3), Year = Year + seq(3)))

#    Year Age x   y
#1   2000   0 1 0.3
#2   2001   1 2 0.7
#3   2002   2 3 0.5
#31  2003   3 3 0.5
#3.1 2004   4 3 0.5
#3.2 2005   5 3 0.5
1 голос
/ 26 мая 2020

Подход dplyr решения @Sotos:

df %>% 
  bind_rows(df[rep(nrow(df), 3),] %>% 
              mutate(Age = Age + seq(3),
                     Year = Year + seq(3)))
1 голос
/ 26 мая 2020

Подход немного отличается от других хороших, опубликованных здесь:

df[4:6, ] <- df[3, ]
  # make new rows numbered 4 to 6 as copies of row 3
df$Year[4:6] <- 2003:2005
  # overwrite new parts of Year variable
df$Age[4:6] <- 3:5 
  # overwrite new parts of Age variable
1 голос
/ 26 мая 2020

Немного неясно, каков здесь вариант использования, поэтому сложно дать вам надежное решение, но быстрый способ будет:

# your initial dataframe
df <- data.frame(Year = c(2000,2001,2002), Age = c(0,1,2), x = c(1,2,3), y = c(0.3,0.7,0.5))

# set the number you'd like to replicate
n <- 5

# create another df with similar columns (this is unnecessary as you could've done it from the beginning)
df2 <- data.frame(Year = c(2003:(2003+n)), Age = c(3:(3+n)), x = rep(3, n), y = rep(0.5, n))

# then bind the frames
final_df <- rbind(df, df2)


Это помогает?

-Бреннан

...