如何将此数据帧写入 excel (xlsx)?
How to write this dataframe to excel (xlsx)?
我有以下格式的数据框:
我想要做的是将它写入一个 .xlsx 文件,如下所示(所有内容合而为一 sheet):
不关心 Excel 文件中的列名。尝试通过 name
进行子集化并使用 cbind()
但它不起作用,因为它们的长度不同。关于如何实现这一点有什么想法吗?
这是一种方法 -
- 在数据帧列表中按
name
拆分数据。
- 从列表中获取最大行数。
- 将
NA
附加到行数较少的数据框并将它们组合在一起。
- 写入 Excel,不带列名。
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 中的样子。
另一种选择是将原始数据框转换为每列中包含不等数量元素的列表。然后可以将此列表转换为具有填充列的数据框。
可以使用以下代码:
# 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)
我有以下格式的数据框:
我想要做的是将它写入一个 .xlsx 文件,如下所示(所有内容合而为一 sheet):
不关心 Excel 文件中的列名。尝试通过 name
进行子集化并使用 cbind()
但它不起作用,因为它们的长度不同。关于如何实现这一点有什么想法吗?
这是一种方法 -
- 在数据帧列表中按
name
拆分数据。 - 从列表中获取最大行数。
- 将
NA
附加到行数较少的数据框并将它们组合在一起。 - 写入 Excel,不带列名。
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 中的样子。
另一种选择是将原始数据框转换为每列中包含不等数量元素的列表。然后可以将此列表转换为具有填充列的数据框。
可以使用以下代码:
# 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)