来自tabulizer的数据输出的错误聚合

时间:2018-04-16 19:47:17

标签: r string data-manipulation

我是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;然后可以修剪,但我不知道如何。 也没有与该解决方案结合 - 开放学习其他方式。 非常感激。

1 个答案:

答案 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))))