【问题标题】:Seprarate data in column without adding new column在不添加新列的情况下分隔列中的数据
【发布时间】:2021-01-27 21:15:50
【问题描述】:

我正在从本地保存的 PDF 中抓取数据(如果我能找到指向其中一个问题 PDF 的链接,我会更新这篇文章),但我遇到了问题。我已经设置了代码,以便如果单词、字符串等之间有 2 个空格,它将把数据读入一个新列。某些数据在 csv 上的间距不是很好,因此它将以|1 100%| 而不是|1|100%| 作为示例读取单元格。我这样做是因为某些列会包含一个句子,所以我需要将它们放在一起

我想做的,因为这一直在随机发生(在 PDF 方面是随机的,在 PDF 中不是随机的),有一些 PDF 是找出一些新代码,这些代码将根据这些列简单地分开空间,并将该行中的所有内容向右推一个单元格。下面的示例代码。请注意,它总是发生在同一列中,如示例数据所示。

我尝试过的所有方法都只是产生了额外的列,这也会丢弃数据。

current_df <- data.frame(X1 = c(1, 2, 3, 4, 5),
                         X2 = c("a 100", "b", "c", "d 400", "e"),
                         X3 = c("aa", 200, 300, "dd", 500),
                         X4= c("dog", "bb", "cc", "chair", "ee"),
                         X5 = c("", "lamp", "desk", "", "speaker"))





goal_df <- data.frame(X1 = c(1, 2, 3, 4, 5),
                 X2 = c("a", "b", "c", "d", "e"),
                 X3 = c(100, 200, 300, 400, 500),
                 X4 = c("aa", "bb", "cc", "dd", "ee"),
                 X5 = c("dog", "lamp", "desk", "chair", "speaker"))

【问题讨论】:

    标签: r data-cleaning csv


    【解决方案1】:

    这是一个笨拙的解决方案:

    setNames(as.data.frame(t(
      apply(as.matrix(current_df), 1, function(r) {
        out <- unlist(strsplit(r, "\\s+"))
        out <- out[!is.na(out) & nzchar(out)]
        stopifnot(length(out) == length(r))
        out
      }))
    ), names(current_df))
    #   X1 X2  X3 X4      X5
    # 1  1  a 100 aa     dog
    # 2  2  b 200 bb    lamp
    # 3  3  c 300 cc    desk
    # 4  4  d 400 dd   chair
    # 5  5  e 500 ee speaker
    

    您需要查看列的classes,因为移动字符串往往会打乱数字。我在这里忽略了数字/字符串,只是在第一个 as.matrix 步骤中将所有内容都转换为 character,假设由于您正在解析 PDF,您可能无论如何都必须监管该部分。

    【讨论】:

      【解决方案2】:

      您可以尝试apply + strsplit + type.convert 如下所示

      type.convert(
        data.frame(
          t(apply(
            current_df,
            1,
            function(v) unlist(strsplit(v, "\\s+"))
          ))
        ),
        as.is = TRUE
      )
      

      给了

        X1 X2  X3 X4      X5
      1  1  a 100 aa     dog
      2  2  b 200 bb    lamp
      3  3  c 300 cc    desk
      4  4  d 400 dd   chair
      5  5  e 500 ee speaker
      

      【讨论】:

        猜你喜欢
        • 2018-01-07
        • 2020-07-18
        • 2015-11-27
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 2022-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多