如何解决分离列中的数据而不添加新列
我正在从本地保存的 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,X2 = c("a","d",X3 = c(100,400,X4 = c("aa",X5 = c("dog","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,因为移动字符串往往会破坏数字。我在这里忽略了数字/字符串,只是在第一个 character
步骤中将所有内容都转换为 as.matrix
,假设由于您正在解析 PDF,您可能无论如何都必须对该部分进行监管。
你可以像下面这样尝试apply
+ strsplit
+ type.convert
type.convert(
data.frame(
t(apply(
current_df,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。