【问题标题】:How to write this dataframe to excel (xlsx)?如何将此数据框写入excel(xlsx)?
【发布时间】:2021-08-24 05:57:34
【问题描述】:

我有以下格式的数据框:

我想要做的是将它写入一个 .xlsx 文件,如下所示(所有内容都在一张表中):

不关心 Excel 文件中的列名。通过name 尝试子集化并使用cbind() 但它不起作用,因为它们的长度不同。关于如何实现这一点的任何想法?

【问题讨论】:

    标签: r dataframe r-xlsx


    【解决方案1】:

    另一个选择是将原始数据框转换为每列中包含不相等数量元素的列表。然后可以将此列表转换为带有填充列的数据框。

    可以使用以下代码:

    # 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)
    

    【讨论】:

      【解决方案2】:

      这是一种方法-

      • 在数据帧列表中按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 中的样子。

      【讨论】:

      • lapply(tmp, [, n, ) - 工作方式真是太棒了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2020-11-05
      • 2013-11-29
      相关资源
      最近更新 更多