我从一个pdf表格中抓取了一些格式不佳的信息,我想把它分成基于空格和逗号分隔符的数值列.请注意,数据之间的空格长度是可变的.有些值还将"%"固定为类似"11.48%"的值,而某些单位也将".%"附加为类似"wt.%"的值.

数据帧‘df’中下面的几行数据.

df <- data.frame(Data = c("Ag, ppm  0.219 0.025 0.169 0.269  0.144 0.294 11.48%  22.96%   34.43%  0.208  0.230",
                               "Al, wt.%  5.27  0.119 5.03  5.50   4.91  5.62 2.25%   4.51%   6.76%   5.00  5.53"))

df$Method <- "XRF"

现在,当我运行以下代码段时,tidyr::Separate‘似乎可以很好地将数据分隔到所需的列中,go 掉"%"符号和".%"后缀,并分配所需的名称.但是,它会截断小数,因此转换后的数值是整数而不是数字.它似乎是与单独使用的".标记应丢弃下一个分隔符、逗号或空格之前的下一个字符.

df2 <- df %>% 
       separate(., col = Data,  into = c("Var", "Unit", "Cert_Val", "ASD1", "ASD2L", 
                                    "ASD2H","ASD3L", "ASD3H", "RSD1","RSD2",
                                    'RSD3', 'Low', "High"), convert = TRUE) 

str(df2)
'data.frame':   2 obs. of  14 variables:
 $ Var     : chr  "Ag" "Al"
 $ Unit    : chr  "ppm" "wt"
 $ Cert_Val: int  0 5
 $ ASD1    : int  219 27
 $ ASD2L   : int  0 0
 $ ASD2H   : int  25 119
 $ ASD3L   : int  0 5
 $ ASD3H   : int  169 3
 $ RSD1    : int  0 5
 $ RSD2    : int  269 50
 $ RSD3    : int  0 4
 $ Low     : int  144 91
 $ High    : int  0 5
 $ Method  : chr  "XRF" "XRF"

我怀疑有一些方法可以使用‘sep’命令来使函数不再使用.作为丢弃的信号字符,但我向可能是正则表达式专家寻求一些帮助,以获得正确的语法.或者,也许有一个更好的解决这个问题的解码问题比使用‘分离’?

推荐答案

如果将分隔符指定为" +"(一个或多个空格)并转换百分比,则输出在我看来是正确的:

library(tidyverse)

df <- data.frame(Data = c("Ag, ppm  0.219 0.025 0.169 0.269  0.144 0.294 11.48%  22.96%   34.43%  0.208  0.230",
                          "Al, wt.%  5.27  0.119 5.03  5.50   4.91  5.62 2.25%   4.51%   6.76%   5.00  5.53"))

df$Method <- "XRF"

df2 <- df %>% 
  separate(col = Data,  into = c("Var", "Unit", "Cert_Val", "ASD1", "ASD2L", 
                                    "ASD2H","ASD3L", "ASD3H", "RSD1","RSD2",
                                    'RSD3', 'Low', "High"), convert = TRUE,
           sep = " +") %>%
  mutate(across(starts_with("RSD"), ~parse_number(.x) / 100),
         Var = sub(",", "", Var))

df2
#>   Var Unit Cert_Val  ASD1 ASD2L ASD2H ASD3L ASD3H   RSD1   RSD2   RSD3   Low
#> 1  Ag  ppm    0.219 0.025 0.169 0.269 0.144 0.294 0.1148 0.2296 0.3443 0.208
#> 2  Al wt.%    5.270 0.119 5.030 5.500 4.910 5.620 0.0225 0.0451 0.0676 5.000
#>   High Method
#> 1 0.23    XRF
#> 2 5.53    XRF

str(df2)
#> 'data.frame':    2 obs. of  14 variables:
#>  $ Var     : chr  "Ag" "Al"
#>  $ Unit    : chr  "ppm" "wt.%"
#>  $ Cert_Val: num  0.219 5.27
#>  $ ASD1    : num  0.025 0.119
#>  $ ASD2L   : num  0.169 5.03
#>  $ ASD2H   : num  0.269 5.5
#>  $ ASD3L   : num  0.144 4.91
#>  $ ASD3H   : num  0.294 5.62
#>  $ RSD1    : num  0.1148 0.0225
#>  $ RSD2    : num  0.2296 0.0451
#>  $ RSD3    : num  0.3443 0.0676
#>  $ Low     : num  0.208 5
#>  $ High    : num  0.23 5.53
#>  $ Method  : chr  "XRF" "XRF"

创建于2023-08-21,共reprex v2.0.2

这能解决你的问题吗?

R相关问答推荐

如何使用geom_sf在边界显示两种 colored颜色 ?

在(g)子中使用asserable字符

R Markdown中的交叉引用表

用黄土法确定区间

使用ggsankey调整Sankey图中单个 node 上的标签

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

打印XTS对象

我们如何在R中透视数据并在之后添加计算

如何使用前缀作为匹配来连接数据帧?

在R中使用列表(作为tibble列)进行向量化?

删除数据帧中特定行号之间的每第三行和第四行

层次树图的数据树

如何根据未知数的多列排除重复行

有没有办法通过str_Detect()或其他字符串匹配函数来连接两个长度不等的数据帧?

随机 Select 的非NA列的行均数

构建一个6/49彩票模拟系统

是否从列中删除★符号?

把代码写成dplyr中的group_by/摘要更简洁吗?

在R中,有没有什么方法可以根据一列中的多个值来过滤行?

R:水平旋转图