在数据框中添加空白行

时间:2019-03-12 04:44:08

标签: r dataframe dplyr

我正在寻找可以插入变量号的代码。带有观察值的每行之后的空白行(4-6)的行数(当前表中有5行),以便我可以将观察值填充/添加到空白行。我遇到以下代码:

library(dplyr)

df %>% 
  split(df$id) %>% 
  Map(rbind, ., NA) %>% 
  do.call(rbind, .) %>%
  mutate(id = rep(df$id, each = 2))

但是,在“每个”中将2替换为4会返回错误消息,

  

“错误:列ID的长度必须为10(行数)或1,而不是长度   20英寸

任何人都建议如何变通以克服困难。 2?

1 个答案:

答案 0 :(得分:0)

这是一种基于R的技术,其前提是获取帧的第NA位返回一行,并用NA个值填充。

dat <- head(iris)
unlist(lapply(seq_len(nrow(dat)), c, rep(NA, 2)))
#  [1]  1 NA NA  2 NA NA  3 NA NA  4 NA NA  5 NA NA  6 NA NA
dat[ unlist(lapply(seq_len(nrow(dat)), c, rep(NA, 2))), ]
#       Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1              5.1         3.5          1.4         0.2  setosa
# NA              NA          NA           NA          NA    <NA>
# NA.1            NA          NA           NA          NA    <NA>
# 2              4.9         3.0          1.4         0.2  setosa
# NA.2            NA          NA           NA          NA    <NA>
# NA.3            NA          NA           NA          NA    <NA>
# 3              4.7         3.2          1.3         0.2  setosa
# NA.4            NA          NA           NA          NA    <NA>
# NA.5            NA          NA           NA          NA    <NA>
# 4              4.6         3.1          1.5         0.2  setosa
# NA.6            NA          NA           NA          NA    <NA>
# NA.7            NA          NA           NA          NA    <NA>
# 5              5.0         3.6          1.4         0.2  setosa
# NA.8            NA          NA           NA          NA    <NA>
# NA.9            NA          NA           NA          NA    <NA>
# 6              5.4         3.9          1.7         0.4  setosa
# NA.10           NA          NA           NA          NA    <NA>
# NA.11           NA          NA           NA          NA    <NA>

(行名可能会分散注意力,但可以轻松删除和/或更改/更新它们。)

在这里,实际观察的行数固定为每行2。如果需要更改它,请使用另一个向量参数从sapply切换到mapply / unlist

unlist(mapply(function(a,b) c(a, rep(NA, b)), seq_len(nrow(dat)), c(2,1,2,1,2,1)))
#  [1]  1 NA NA  2 NA  3 NA NA  4 NA  5 NA NA  6 NA
dat[ unlist(mapply(function(a,b) c(a, rep(NA, b)), seq_len(nrow(dat)), c(2,1,2,1,2,1))), ]
#      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1             5.1         3.5          1.4         0.2  setosa
# NA             NA          NA           NA          NA    <NA>
# NA.1           NA          NA           NA          NA    <NA>
# 2             4.9         3.0          1.4         0.2  setosa
# NA.2           NA          NA           NA          NA    <NA>
# 3             4.7         3.2          1.3         0.2  setosa
# NA.3           NA          NA           NA          NA    <NA>
# NA.4           NA          NA           NA          NA    <NA>
# 4             4.6         3.1          1.5         0.2  setosa
# NA.5           NA          NA           NA          NA    <NA>
# 5             5.0         3.6          1.4         0.2  setosa
# NA.6           NA          NA           NA          NA    <NA>
# NA.7           NA          NA           NA          NA    <NA>
# 6             5.4         3.9          1.7         0.4  setosa
# NA.8           NA          NA           NA          NA    <NA>