根据前导空格数量将列分成新列

5
这些报告来自quickbooks,以Excel文件下载。请注意左侧列是基于左侧间距的嵌套层次结构。
我需要根据左侧前导空格数将描述列分成单独的列。
由于我最近一直在处理财务报告,这些报告非常常见且极难处理。是否有导入此类数据的软件包或功能?

enter image description here

这是一个可重复的输入数据框架示例:

df1 <- structure(list(Description = c("asset", " current asset", "   bank acc", 
                                      "    banner", "    clearing",
                                      "   total bank accounts",
                                      " total current assets"),
                 Total = c(NA, NA, NA, 10L, 20L, 30L, 30L)),
            .Names = c("Description", "Total"), 
            class = "data.frame", 
            row.names = c(NA, -7L))

1
“[使用前导缩进表示多列层次结构]非常普遍,但极其难以处理。是否有任何包或函数可以解决这个问题?” 显然不是针对缩进问题,但您可以在tidyxl上提出增强请求。 - smci
1
@smci 不错的想法,已经发布了一个功能请求 - zx8754
你可能需要在他们的 Github 工单中重新表述请求;同时说明它经常出现在财务报告中(Quickbooks?还有其他格式吗?)。顺便问一下,推断列应该是“Col1,Col2...”还是你想要给它们命名? - smci
2个回答

5

谢谢你,Matt!!! 我一个星期都想不出来这个问题。非常感激。 - Super_John

3

我认为真正的问题是:

  • "如何处理前导空格数量以表示第n列?"

如果是这样,那么可以尝试这个例子,代码可能需要改进,但是基本思想是每个前导空格表示第n列。

# example input, we will have similar input after reading in
# the Excel sheet into R.
df1 <- data.frame(x = c("x1", " x2", " x2", "  x3", "x1", " x2"),
                  y = c(NA,      22,    33,      44,   55,   66),
                  stringsAsFactors = FALSE)

library(dplyr)

cbind(
  bind_rows(
  lapply(df1$x, function(i){
    x <- data.frame(t(strsplit(i, split = " ")[[1]]), stringsAsFactors = FALSE)
    colnames(x) <- paste0("col", 1:ncol(x))
    x
    })
  ),
  df1[, "y", drop = FALSE])

#   col1 col2 col3  y
# 1   x1 <NA> <NA> NA
# 2        x2 <NA> 22
# 3        x2 <NA> 33
# 4             x3 44
# 5   x1 <NA> <NA> 55
# 6        x2 <NA> 66

我认为你是完全正确的。还需要弄清楚上述包是否直接解决了这个问题,否则,这是一个很好的解决方案。非常感谢!!! - Super_John
@Super_John 很好,这正是我想的。我用简化的可重现输入示例编辑了您的帖子。希望这会吸引更好的答案。 - zx8754

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接