R语言 从df中的每个单元格中删除所有非数字字符

3lxsmp7m  于 2023-04-27  发布在  其他
关注(0)|答案(3)|浏览(167)

我有很多文件,每个单元格包含一串字母和特殊字符,然后是一个数字。我想从R中的每个单元格中删除所有非数字字符。
我已经研究过使用gsublapply的解决方案,但它们似乎需要您指定要删除的字符串。这是一个问题,因为每个单元格中的每个字母/特殊字符串都是唯一的。我也尝试过使用this question,但它完全删除了所有字符(我猜它不能识别数字为数字...)。
下面是我的df的例子(只有一行):
| 色谱柱A|B栏|色谱柱C|D栏|E列|F列|
| --------------|--------------|--------------|--------------|--------------|--------------|
| 设计日期:13|hhh:34|dsd:15|FFD:67|简体中文|hhj:43|
我想:
| 色谱柱A|B栏|色谱柱C|D栏|E列|F列|
| --------------|--------------|--------------|--------------|--------------|--------------|
| 十三|三十四|十五岁|六十七|八九|四十三|

yrwegjxp

yrwegjxp1#

我们可以

library(dplyr)
df1 %>%
   mutate(across(everything(), ~ readr::parse_number(.x)))
6ovsh4lw

6ovsh4lw2#

既然你在问题中特别提到了lapplygsub,那么在基R中你可以这样做:

df[] <- lapply(df[], function(x) as.numeric(gsub("\\D", "", x)))

注意[]在使用lapply时很重要(表示它应该在所有列上运行)。\\D表示除了数字之外的所有内容,所以如果有负数,它也会删除“-”,在这种情况下,您可能需要提取冒号之后的所有内容:

df[] <- lapply(df[], function(x) as.numeric(sub(".*\\:", "", x)))

无论哪种方式,输出都是:

#   Column_A Column_B Column_C Column_D Column_E Column_F
# 1       13       34       15       67       89       43
x6yk4ghg

x6yk4ghg3#

1)Base R我们删除所有非数字字符(\\D表示非数字),然后使用type.convert将剩下的字符转换为数字。不使用包,也不覆盖DF-覆盖对象容易出错。(输入以可重现的形式显示在最后的注解中。)

DF |> 
  list(x = _) |>
  with(replace(x, TRUE, lapply(x, trimws, whitespace = "\\D"))) |>
  type.convert(as.is = TRUE)
##   Column A Column B Column C Column D Column E Column F
## 1       13       34       15       67       89       43

2)collapse::dapply使用collapse包,我们可以使用dapply在列上应用trimws,然后如上所述使用type. convert。

library(collapse)

DF |>
  dapply(trimws, whitespace = "\\D", drop = FALSE) |> 
  type.convert(as.is = TRUE)
##   Column A Column B Column C Column D Column E Column F
## 1       13       34       15       67       89       43

3)purrr我们可以在下面使用map。(map_dfr也可以工作,但最近被弃用。)

library(purrr)

DF %>%
  map(trimws, whitespace = "\\D") %>%
  as.data.frame %>%
  type.convert(as.is = TRUE)
##   Column A Column B Column C Column D Column E Column F
## 1       13       34       15       67       89       43

4)furrr我们可以从purrr中使用map_dfr,也可以从furrr中使用相应的函数。我们在下面展示了后者。map_dfr在purrr中已经被取代,尽管它仍然存在并且没有被弃用。

library(furrr)

DF |>
  future_map_dfr(trimws, whitespace = "\\D") |>
  type.convert(as.is = TRUE)
## # A tibble: 1 × 6
##   `Column A` `Column B` `Column C` `Column D` `Column E` `Column F`
##        <int>      <int>      <int>      <int>      <int>      <int>
## 1         13         34         15         67         89         43

注意事项

DF <- structure(list(`Column A` = "dfd:13", `Column B` = "hhh:34", 
    `Column C` = "dsd:15", `Column D` = "ffd:67", `Column E` = "hdf:89", 
    `Column F` = "hhj:43"), class = "data.frame", row.names = c(NA, 
-1L))

相关问题