首页 > 解决方案 > 文本清理:删除错误字符

问题描述

我有一个名为“义务”的列,其中有每个财政年度的财务价值,例如“(项目赠款)FY 17$XX.XX; FY 18 est $XX.XX; FY 19 est $XX.XX; FY 16$ XX.XX;" 我最终尝试选择每个值并将它们放入新列中以获得正确的 FY,但是,首先我尝试使用一些工具(即 stringr)来消除我想要的信息周围的噪音。并非列中的每个实例都以 (Project Grants) 开头,它们有很多,所以我将继续在我的 if 语句中为不同类型使用 ELIF 选项。该代码没有从我的问题文本中删除(项目资助)。

我认为为这个过程创建一个函数可能会更好,但我是这门语言的新手,不知道从哪里开始或如何创建函数,因此我选择先删除字符,然后最终使用 extract()创建我需要的列。

data %>%
  select(Obligations..122.)%>%
  if(starts_with(Obligations..122.) = "(Project Grants)"){
    str_sub(data$Obligations..122., start = 16)
  }

head(data$Obligations..122.)
[1] "(Project Grants) FY 17$45,381,885.00; FY 18 est $35,000,000.00; FY 19 
est $35,000,000.00; FY 16$45,381,885.00; - "                                                                                                                                                                                                                                                      
[2] "(Salaries and Expenses) FY 17$243,631,584.00; FY 18 est 
$256,467,514.00; FY 19 est $193,289,258.00; FY 16$239,406,515.00; - APHIS 
has a difference between budget authority and obligations because there is 
carryover funding available from no year funding.\n" 

输出将是我拥有原始列 Obligations..122 的位置。紧随其后的是 FY16/FY17/... 等等,您在上面的输出中看到的值。

标签: rtext-miningstringr

解决方案


使用该select步骤,它仅选择单个列,因此,多个列可能无法用于if下面的步骤。相反,它可以用mutate_at

library(dplyr)
library(stringr)
library(tidyr)
data %>%
    mutate_at(vars(starts_with("Obligations..122.")), ~ str_sub(. start = 16))

如果它只有一列,可以直接选择它,但要确保它用反引号引起来,因为列名有不寻常的字符

data %>%
    group_by(newColumn = str_sub(`Obligations..122.`, start = 16)) %>%
    mutate(ind = row_number(), i1 = 1) %>%
    spread(newColumn, i1, fill = 0)

推荐阅读