微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

分离列中的数据而不添加新列

如何解决分离列中的数据而不添加新列

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

您需要查看列的 classes,因为移动字符串往往会破坏数字。我在这里忽略了数字/字符串,只是在第一个 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 举报,一经查实,本站将立刻删除。