R 如何在数据框中每隔3行插入空白行?

R 如何在数据框中每隔3行插入空白行?,r,dataframe,add,each,blank-line,R,Dataframe,Add,Each,Blank Line,如何在数据框中每隔3行插入空白行? 经过一个网页抓取过程后,我得到了一个包含我需要的信息的数据框,但是最终的excel格式要求我每3行添加一个空行。我在网上搜索了帮助,但还没有找到解决方案 对于假设数据,我的数据框架结构如下: mi_dftmp这里有一种方法。 按ID拆分为列表,添加空行,然后将列表绑定回数据帧 mi_df2 <- do.call(rbind,Map(rbind,split(mi_df,mi_df$ID),rep("",3))) rownames(mi_df2) <-

如何在数据框中每隔3行插入空白行? 经过一个网页抓取过程后,我得到了一个包含我需要的信息的数据框,但是最终的excel格式要求我每3行添加一个空行。我在网上搜索了帮助,但还没有找到解决方案

对于假设数据,我的数据框架结构如下:

mi_df
tmp这里有一种方法。
按ID拆分为列表,添加空行,然后将列表绑定回数据帧

mi_df2 <- do.call(rbind,Map(rbind,split(mi_df,mi_df$ID),rep("",3)))
rownames(mi_df2) <- NULL

mi_df2如果数据帧的索引包含
NA
,则输出将有
NA
行。因此,我的目标是创建一个类似于
123na456na…
的向量,并将其设置为
mi_df
的索引

cut <- rep(1:(nrow(mi_df)/3), each = 3)
mi_df[sapply(split(1:nrow(mi_df), cut), c, NA), ]

#      ID    X  Y
# 1     1    a  1
# 2     1    a  3
# 3     1    a  5
# NA   NA <NA> NA
# 4     2    b  7
# 5     2    b  9
# 6     2    b 11
# NA.1 NA <NA> NA
# 7     3    c 13
# 8     3    c 15
# 9     3    c 17
# NA.2 NA <NA> NA

不要介意输出中的
NA
,因为某些将数据写入excel文件的函数有一个可选的参数控件,用于控制
NA
值是否转换为字符串或为空。例如

library(openxlsx)
write.xlsx(df, "test.xlsx", keepNA = FALSE) # defaults to FALSE

我的建议与所有其他答案有些不同:不要在
R
中弄乱数据集。使用现有包写入Excel工作簿中的指定行。例如,对于软件包
xlConnect
,方法
writeWorksheet
(从
writeWorksheetToFile
调用)包含以下参数:

对象要写入的工作簿数据要写入的数据
工作表要写入的工作表的名称或索引
要写入的第一行的startRow索引。默认值为startRow=1。
要写入的第一列的startCol索引。默认值为startCol=1


因此,如果您只需设置一个循环,一次写入数据文件的3行,然后将行索引下移4,然后写入接下来的3行,等等,那么您就完成了设置。

是否要在每个ID之后添加一行?(本例中每三行正好有一行)要做的第一件事是在Excel中修复这条荒谬的规则。没有理由用空行设计电子表格。我知道,我知道:一些PHB坚持。你也可以使用越界索引:
do.call(rbind,by(mi_-df,rep(1:(nrow(mi_-df)/3),each=3),
[
,1:4,)
。当然,
[
周围的内联倒勾弄得一团糟-我从来没有学过怎么做;)无论如何,我怀疑OP想要的是空白,而不是
NA
(用于漂亮的打印格式)。@Henrik实际上输出中的
NA
并不重要,因为一些将数据写入excel文件的函数有一个可选参数,控制
NA
值转换为字符串或为空。例如
openxlsx::write.xlsx(…,keepNA=FALSE)
我尝试使用xlConnect软件包,但在使用xlsx软件包绑定到Java时遇到问题,我对此有点陌生,希望将来能这样做,谢谢Carl。非常好的Darren,肯定是一个非常有用的选项,非常感谢。非常好的Darren,肯定是一个非常有用的选项。但是对我有效的NA选项是showNA=FALSE
cut <- rep(1:(nrow(mi_df)/3), each = 3)
mi_df[sapply(split(1:nrow(mi_df), cut), c, NA), ]

#      ID    X  Y
# 1     1    a  1
# 2     1    a  3
# 3     1    a  5
# NA   NA <NA> NA
# 4     2    b  7
# 5     2    b  9
# 6     2    b 11
# NA.1 NA <NA> NA
# 7     3    c 13
# 8     3    c 15
# 9     3    c 17
# NA.2 NA <NA> NA
# Version 1
cut <- rep(1:ceiling(nrow(mi_df)/3), each = 3, len = nrow(mi_df))
mi_df[Reduce(c, lapply(split(1:nrow(mi_df), cut), c, NA)), ]

# Version 2
cut <- rep(1:ceiling(nrow(mi_df)/3), each = 3, len = nrow(mi_df))
mi_df[Reduce(function(x, y) c(x, NA, y), split(1:nrow(mi_df), cut)), ]
library(openxlsx)
write.xlsx(df, "test.xlsx", keepNA = FALSE) # defaults to FALSE