r - 使用 dplyr / data.table 插入新行
问题描述
样本数据
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))
每年,如果没有。ofref.doy
不是 9,那么我想插入额外的新行,这只是最后一行的副本。
例如,如果 1995 年只有 8 个ref.doy
,我想复制第 8 行使其成为第 9 行。如果 2013 年只有 8ref.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
。
解决方案
以您最近两年的数据(分别在 2013 年和 2014 年有 5 个和 9 个条目)作为样本。我们filter
是少于 9 行的组,对于那些组,我们重复最后一行9 - n()
多次,并使用 .将这些行添加到原始数据框中bind_rows
。
df1 <- tail(df, 14)
library(dplyr)
df1 %>%
bind_rows(df1 %>%
group_by(year) %>%
#suggested by @Henrik
filter(n() < 9) %>%
slice(rep(n(), 9 - n()))) %>%
arrange(year)
# year ref.doy x
#1 2013 126 0.9171749
#2 2013 168 -2.6609228
#3 2013 167 1.1102771
#4 2013 120 -0.4849876
#5 2013 167 0.2306168
#6 2013 167 0.2306168
#7 2013 167 0.2306168
#8 2013 167 0.2306168
#9 2013 167 0.2306168
#10 2014 164 -0.2951578
#11 2014 158 0.8719650
#12 2014 149 -0.3484724
#13 2014 129 0.5185038
#14 2014 120 -0.3906850
#15 2014 147 -1.0927872
#16 2014 150 1.2100105
#17 2014 143 0.7409000
#18 2014 148 1.7242622
将其应用于原始数据帧,我们检查每个year
.
df2 <- df %>%
bind_rows(df %>%
group_by(year) %>%
filter(n() < 9) %>%
slice(rep(n(), 9 - n()))) %>%
arrange(year)
df2 %>%
group_by(year) %>%
summarise(no_of_rows = n())
# A tibble: 35 x 2
# year no_of_rows
# <dbl> <int>
# 1 1980 9
# 2 1981 9
# 3 1982 9
# 4 1983 9
# 5 1984 9
# 6 1985 9
# 7 1986 9
# 8 1987 9
# 9 1988 9
#10 1989 9
# ... with 25 more rows
或者正如@Henrik 所提到的,最简单的方法是取每组的最后一行并重复9 - n()
多次,而不管。
df %>%
group_by(year) %>%
slice(c(1:n(), rep(n(), 9 - n())))
推荐阅读
- mocha.js - 我可以在没有“@std/esm”库的情况下将 NYC 与 ESM 和 Mocha 一起使用吗
- powershell - PowerShell 过滤远程桌面用户组的输出
- elasticsearch - 如何在 Elasticsearch reindex 无痛脚本中生成 UUID
- c++ - gcc ld:未找到架构 i386 的符号
- java - 在java中将列表存储一段时间
- gtk - GFile 的指针类型不兼容 [-Wincompatible-pointer-types]
- html - 如何通过超出该div的高度使div的内容进入下一列
- windows - 使用 Windows 批处理命令批量查找并用连字符替换破折号
- python - 我想使用 python 创建数组问题
- javascript - 点击没有id和名字