【发布时间】:2019-03-06 08:22:05
【问题描述】:
样本数据
set.seed(123)
df <- data.frame(year = c(rep(1980:1994, each = 9), rep(1995, times = 8), rep(1996:2012, each = 9),
rep(2013, times = 7), rep(2014, times = 9)),
ref.doy = sample(120:180, 312, replace = T),
x = rnorm(312))
每年,如果没有。 ref.doy 不是 9,那么我想插入额外的新行,这只是最后一行的副本。
例如如果 1995 年只有 8 个ref.doy,我想复制第 8 行使其成为第 9 行。如果 2013 年只有 8 个ref.doy,那么我想复制第 7 行并将其复制为第 8 行和第 9 行等等。
我目前的解决方案是for循环:
x <- df %>% group_by(year) %>% dplyr::mutate(y.length = n())
year.vec <- 1980:2014
temp.list <- list()
for(y in seq_along(year.vec)){
yr <- year.vec[y]
temp <- x %>% dplyr::filter(year == yr)
if(unique(temp$y.length) != 9) {
lastrow <- temp[nrow(temp), ]
lastrow.repeat <- as.data.frame(lapply(lastrow, rep, 9 - nrow(temp)))
full.data <- rbind(data.frame(temp), lastrow.repeat)
temp.list[[y]] <- full.data
} else {
temp.list[[y]] <- temp
}
}
newdata <- rbindlist(temp.list)
我需要一些帮助才能在 dplyr 或 data.table 本身内完成。
【问题讨论】:
-
如果您使用的是示例,请在使用
set.seed()运行代码之前设置种子。否则结果无法重现。 -
好的。我去做。谢谢
标签: r dplyr data.table