如何在数据框中每 3 个现有行插入空白行?
How can I insert blank rows every 3 existing rows in a data frame?
如何在数据框中每 3 个现有行插入空白行?
在网络抓取过程之后,我得到了一个包含我需要的信息的数据框,但是最终的 excel 格式要求我每 3 行添加一个空白行。我已在网上搜索帮助,但尚未找到解决方案。
假设数据,我的数据框结构如下:
mi_df <- data.frame(
"ID" = rep(1:3,c(3,3,3)),
"X" = as.character(c("a", "a", "a", "b", "b", "b", "c", "c", "c")),
"Y" = seq(1,18, by=2)
)
mi_df
ID X Y
1 1 a 1
2 1 a 3
3 1 a 5
4 2 b 7
5 2 b 9
6 2 b 11
7 3 c 13
8 3 c 15
9 3 c 17
我希望的结果是这样的
ID X Y
1 1 a 1
2 1 a 3
3 1 a 5
4
5 2 b 7
6 2 b 9
7 2 b 11
8
9 3 c 13
10 3 c 15
11 3 c 17
tmp <- split(mi_df, rep(1:(nrow(mi_df) / 3), each = 3))
# or split(mi_df, ggplot2::cut_width(seq_len(nrow(mi_df)), 3, center = 2))
do.call(rbind, lapply(tmp, function(x) { x[4, ] <- NA; x }))
ID X Y
1.1 1 a 1
1.2 1 a 3
1.3 1 a 5
1.4 NA <NA> NA
2.4 2 b 7
2.5 2 b 9
2.6 2 b 11
2.4.1 NA <NA> NA
3.7 3 c 13
3.8 3 c 15
3.9 3 c 17
3.4 NA <NA> NA
您可以通过分配空字符向量 (""
) 而不是 NA
来创建空行,但这样会将您的列转换为字符,我不推荐这样做.
这是一种方法。
按 ID 拆分为列表,添加空行,然后将列表绑定回数据框。
mi_df2 <- do.call(rbind,Map(rbind,split(mi_df,mi_df$ID),rep("",3)))
rownames(mi_df2) <- NULL
如果数据框的索引包含 NA
,则输出将有 NA
行。所以我的目标是创建一个像 1 2 3 NA 4 5 6 NA ...
这样的向量并将其设置为 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
如果nrow(mi_df)
不是3的倍数,那么下面是一个通用的解法:
# 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)), ]
不要介意输出中的 NA
,因为某些将数据写入 excel 文件的函数有一个可选参数控制 NA
值是否转换为字符串或空的。例如
library(openxlsx)
write.xlsx(df, "test.xlsx", keepNA = FALSE) # defaults to FALSE
我的建议与所有其他答案有些不同:不要弄乱 R
中的数据集。使用现有包写入 Excel 工作簿中的指定行。例如,对于包 xlConnect
,方法 writeWorksheet
(从 writeWorksheetToFile
调用)包括这些参数:
object The workbook to write to data Data to write
sheet The name or index of the sheet to write to
startRow Index of the first row to write to. The default is startRow = 1.
startCol Index of the first column to write to. The default is startCol = 1.
因此,如果您只是设置一个循环,一次写入数据文件的 3 行,然后将行索引向下移动 4 并写入接下来的 3 行,依此类推,您就大功告成了。
如何在数据框中每 3 个现有行插入空白行? 在网络抓取过程之后,我得到了一个包含我需要的信息的数据框,但是最终的 excel 格式要求我每 3 行添加一个空白行。我已在网上搜索帮助,但尚未找到解决方案。
假设数据,我的数据框结构如下:
mi_df <- data.frame(
"ID" = rep(1:3,c(3,3,3)),
"X" = as.character(c("a", "a", "a", "b", "b", "b", "c", "c", "c")),
"Y" = seq(1,18, by=2)
)
mi_df
ID X Y
1 1 a 1
2 1 a 3
3 1 a 5
4 2 b 7
5 2 b 9
6 2 b 11
7 3 c 13
8 3 c 15
9 3 c 17
我希望的结果是这样的
ID X Y
1 1 a 1
2 1 a 3
3 1 a 5
4
5 2 b 7
6 2 b 9
7 2 b 11
8
9 3 c 13
10 3 c 15
11 3 c 17
tmp <- split(mi_df, rep(1:(nrow(mi_df) / 3), each = 3))
# or split(mi_df, ggplot2::cut_width(seq_len(nrow(mi_df)), 3, center = 2))
do.call(rbind, lapply(tmp, function(x) { x[4, ] <- NA; x }))
ID X Y 1.1 1 a 1 1.2 1 a 3 1.3 1 a 5 1.4 NA <NA> NA 2.4 2 b 7 2.5 2 b 9 2.6 2 b 11 2.4.1 NA <NA> NA 3.7 3 c 13 3.8 3 c 15 3.9 3 c 17 3.4 NA <NA> NA
您可以通过分配空字符向量 (""
) 而不是 NA
来创建空行,但这样会将您的列转换为字符,我不推荐这样做.
这是一种方法。 按 ID 拆分为列表,添加空行,然后将列表绑定回数据框。
mi_df2 <- do.call(rbind,Map(rbind,split(mi_df,mi_df$ID),rep("",3)))
rownames(mi_df2) <- NULL
如果数据框的索引包含 NA
,则输出将有 NA
行。所以我的目标是创建一个像 1 2 3 NA 4 5 6 NA ...
这样的向量并将其设置为 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
如果nrow(mi_df)
不是3的倍数,那么下面是一个通用的解法:
# 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)), ]
不要介意输出中的 NA
,因为某些将数据写入 excel 文件的函数有一个可选参数控制 NA
值是否转换为字符串或空的。例如
library(openxlsx)
write.xlsx(df, "test.xlsx", keepNA = FALSE) # defaults to FALSE
我的建议与所有其他答案有些不同:不要弄乱 R
中的数据集。使用现有包写入 Excel 工作簿中的指定行。例如,对于包 xlConnect
,方法 writeWorksheet
(从 writeWorksheetToFile
调用)包括这些参数:
object The workbook to write to data Data to write
sheet The name or index of the sheet to write to
startRow Index of the first row to write to. The default is startRow = 1.
startCol Index of the first column to write to. The default is startCol = 1.
因此,如果您只是设置一个循环,一次写入数据文件的 3 行,然后将行索引向下移动 4 并写入接下来的 3 行,依此类推,您就大功告成了。