![](/img/trans.png)
[英]R: error in adding new column to data frame without any rows "replacement has 1 row, data has 0"
[英]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.