如何将此数据帧写入 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)