簡體   English   中英

在不添加新列的情況下分離列中的數據

[英]Seprarate data in column without adding new column

我正在從本地保存的 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"))

這是一個笨拙的解決方案:

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

您將需要查看列的class es,因為移動字符串往往會破壞數字。 我在這里忽略了數字/字符串,只是在第一個as.matrix步驟中將所有內容轉換為character ,假設由於您正在解析 PDF,因此您可能無論如何都必須監管該部分。

您可以嘗試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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM