【发布时间】:2021-08-24 05:57:34
【问题描述】:
我有以下格式的数据框:
我想要做的是将它写入一个 .xlsx 文件,如下所示(所有内容都在一张表中):
不关心 Excel 文件中的列名。通过name 尝试子集化并使用cbind() 但它不起作用,因为它们的长度不同。关于如何实现这一点的任何想法?
【问题讨论】:
我有以下格式的数据框:
我想要做的是将它写入一个 .xlsx 文件,如下所示(所有内容都在一张表中):
不关心 Excel 文件中的列名。通过name 尝试子集化并使用cbind() 但它不起作用,因为它们的长度不同。关于如何实现这一点的任何想法?
【问题讨论】:
另一个选择是将原始数据框转换为每列中包含不相等数量元素的列表。然后可以将此列表转换为带有填充列的数据框。
可以使用以下代码:
# The original data frame
n <- c("car", "car", "van", "bus", "bus", "bus")
i <- c(1,2,1,-1,0,1)
v <- c(10,20,15,20,25,25)
df <- data.frame(name = n, index = i, value = v)
# The data frame is converted to a list
l <- list(
"car" = rep("car", nrow(df[df$name == "car", ])),
"car_index" = df[df$name == "car", "index"],
"car_value" = df[df$name == "car", "value"],
"van" = rep("van", nrow(df[df$name == "van", ])),
"van_index" = df[df$name == "van", "index"],
"van_value" = df[df$name == "van", "value"],
"bus" = rep("bus", nrow(df[df$name == "bus", ])),
"bus_index" = df[df$name == "bus", "index"],
"bus_value" = df[df$name == "bus", "value"])
# The list column names
cols <- names(l)
# The maximum column length
max_len <- 0
for (col in cols){
if (length(l[[col]]) > max_len)
max_len <- length(l[[col]])
}
# Each column is padded
for (col in cols){
l[[col]] <- c(l[[col]], rep("", max_len - length(l[[col]])))
}
# The list is converted to data frame
df_new <- as.data.frame(l)
# The data frame is written to xlsx file
writexl::write_xlsx(df_new, 'test.xlsx', col_names = FALSE)
【讨论】:
这是一种方法-
name 拆分数据。NA 附加到行数较少的数据框中,并将它们组合在一起。df <- data.frame(name = c('car', 'car', 'van', 'bus', 'bus', 'bus'),
index = c(1, 2, 1, -1, 0, 1),
value = c(10, 20, 15, 20, 25, 25))
tmp <- split(df, df$name)
n <- 1:max(sapply(tmp, nrow))
writexl::write_xlsx(do.call(cbind, lapply(tmp, `[`, n, )),
'result.xlsx', col_names = FALSE)
这就是它在 Excel 中的样子。
【讨论】:
[, n, ) - 工作方式真是太棒了