R语言 将数据框分隔为适当的列

oxf4rvwz  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(139)

我已经从PDF文件中提取了数据,现在有一个 Dataframe (my_data)的3085观察(字符)1变量(填充),这里有两行:
2012年第二季度1004001115648091 001 2011年12月2日10 000,00美元2 500,00美元10 000美元495,65美元13 005,65美元
2012年第二季度第19号1004001113343232 001号2009年11月5日
我如何将它分成11个变量,就像它最初在pdf中一样,并用NAs填充空白?好的分离应该是这样的:
2012年第2季度不适用1004001115648091 / 001 / 2011年12月2日10 000,00美元/ 2 500,00美元/10,00美元/495,65美元/ 13 005,65美元
2012 / Q-2 /第19号规则/ 1004001113343232 / 001 / 2009-11-05 / 50 000,00美元/ 2 900,00美元/10,00美元/ 52 910,00美元
我正在尝试用separate()来实现这一点,但我对正则表达式没有很好的理解,根据一个在线博客,我目前能做到的最好的是:

my_data %>% 
  separate(stuff, c("A","B", "C", "D", "E", "F", "G", "H", "I", "K", "L"), sep = "\\s")

这会在每一白色处产生分隔。这是有问题的,因为它将$从金额和1 000中分隔到两个不同的列中,并且在有缺失值时不会用NA填充空白,而是将整个内容移位以填充差距。

jm2pwxwz

jm2pwxwz1#

试试这个。然而,因为它是小样本正则表达式的情况,我不确定它是否涵盖了所有情况。

data = c(
"2012 Q-2 1004001115648091 001 2011-12-02 10 000,00 $ 2 500,00 $ 10,00 $ 495,65 $ 13 005,65 $",
"2012 Q-2 r.19 1004001113343232 001 2009-11-05 50 000,00 $ 2 900,00 $ 10,00 $ 52 910,00 $")

r <- regexec(paste0(
"(\\d{4}) (Q-\\d) (?:([^ ]+) )?(\\d{16}) (\\d{3}) (\\d{4}-\\d{2}-\\d{2}) ",
"(-?\\d{1,3}(?: \\d{3})*,\\d{2} \\$) (-?\\d{1,3}(?: \\d{3})*,\\d{2} \\$) ",
"(-?\\d{1,3}(?: \\d{3})*,\\d{2} \\$)"), data) 

do.call(rbind, regmatches(data, r))[,-1]
#>      [,1]   [,2]  [,3]   [,4]               [,5]  [,6]         [,7]         
#> [1,] "2012" "Q-2" ""     "1004001115648091" "001" "2011-12-02" "10 000,00 $"
#> [2,] "2012" "Q-2" "r.19" "1004001113343232" "001" "2009-11-05" "50 000,00 $"
#>      [,8]         [,9]     
#> [1,] "2 500,00 $" "10,00 $"
#> [2,] "2 900,00 $" "10,00 $"

相关问题