我是R的新手 - 但现在已经花了几天时间拼凑起来(谢谢堆栈交换社区)我需要的代码,以便完成我想要做的事情:从头到尾,我正在使用Tabulizer程序包将pdf表处理成R.我正在努力解决数字的错误聚集(不包括pdf)以及如何有效地将它们分成适当的列。
这是Tabulizer输出中相关列的子集:
'data.frame': 26 obs. of 3 variables:
$ X1: Factor w/ 29 levels "Region A","Region B",..: 22 2 3 4 5 6 7 8 9 10 ...
$ X2: Factor w/ 29 levels "1 192 36,7","102 4,6",..: 21 20 4 1 23 10 18 14 26 17 ...
$ X3: Factor w/ 29 levels "1 144 48,2","1 800 55, 8",..: 24 6 7 2 23 11 22 17 26 21 ...
更具体地说:" 1 800 55,8"是错误的错误聚集" 1800"和" 55.8",这发生在整个专栏中(应该是两个)。
我正在使用gsub(在循环中)将十进制逗号替换为小数点,并删除所述小数点周围的不需要的空格。
for (i in 2:ncol(Tab)) { #some of the tables have multiple columns
Tab[[i]] <- gsub(",", "\\.", Tab[[i]])
Tab[[i]] <- gsub("\\. ", "\\.", Tab[[i]])
Tab[[i]] <- gsub(" \\. ", "\\.", Tab[[i]])
}
这让我得到了#800; 1 800 55.8&#34;哪个好,但不好;第一个空间可能存在也可能不存在,或者可能存在两个空间,具体取决于数字的大小 - 空间是原始文档中千位分隔符的替身。
我想将列转换为适当的两个新列。 我尝试过使用stringi :: word来隔离&#34;最后一个字&#34;并且我试图匹配|从原始列中提取输出(55.8),留下&#34; 1 800&#34;然后可以修剪,但我不知道如何。 也没有与该解决方案结合 - 开放学习其他方式。 非常感激。
答案 0 :(得分:1)
您可以尝试在extract_tables中使用columns参数指定列的分隔位置。我使用它的方式是先使用:
df.set_index(['client_city','client_state','subscription_type','client_id'], inplace=True)
df['monthly_fee_scaled'] = np.nan
grp_by_city = []
grp_by_state = []
for ii, grp in df.groupby(level=[0,2]):
N = grp.shape[0] # number of clients in this city
if N>=20:
power_tran = PowerTransformer()
grptmp = grp[['monthly_fee',]].copy()
grptmp['monthly_fee_scaled'] = power_tran.fit_transform(grp[['monthly_fee',]])
grp_by_city.append(grptmp)
else:
pass
tmp = pd.concat(grp_by_city)
df.update(tmp)
for ii, grp in df.groupby(level=[1,2]):
N = grp.shape[0] # number of clients in this state
if N>=20:
power_tran = PowerTransformer()
grptmp = grp[['monthly_fee',]].copy()
grptmp['monthly_fee_scaled'] = power_tran.fit_transform(grp[['monthly_fee',]])
grp_by_state.append(grptmp)
else:
pass
tmp = pd.concat(grp_by_state)
df.update(tmp, overwrite=False)
这将允许您获取表格的位置。然后使用左右坐标来猜测列的分隔位置,并在提取表时使用
tabulizer::locate_areas(FilePath)
您还可以通过添加“ area”参数来指定表的位置:
tabulizer::extract_tables(FilePath, pages = 1, guess = FALSE
, columns = list(c(300))))