尽可能将字符转换为整数

Posted

技术标签:

【中文标题】尽可能将字符转换为整数【英文标题】:Converting character to integer when it is possible 【发布时间】:2022-01-18 19:11:03 【问题描述】:

我有以下数据框:

y  <- c("11 - 14", "13 - 17", "13 - 19")
x1 <- c(10, 11, 8)
x2 <- c(31, 30, 30)

df <- data.frame(y, x1, x2)

如何将字符转换为唯一整数,例如均值?

例如,"11 - 14" 变为 12.5

【问题讨论】:

【参考方案1】:

拆分" - ",然后将每个转换为数字并取平均值。

y_split <- strsplit(df$y, " - ")
df$y <- sapply(y_split, function(x) mean(as.numeric(x)))
df
#>      y x1 x2
#> 1 12.5 10 31
#> 2 15.0 11 30
#> 3 16.0  8 30

【讨论】:

【参考方案2】:

与其他答案相同的方法,但使用 tidyverse 包:

library(purrr)
library(stringr)
library(dplyr)
df %>%
  mutate(
    y_nums = str_extract_all(y, pattern = "[[:digit:]]+"),
    result = map(y_nums, .f = ~mean(as.numeric(.)))
  )
#         y x1 x2 y_nums result
# 1 11 - 14 10 31 11, 14   12.5
# 2 13 - 17 11 30 13, 17     15
# 3 13 - 19  8 30 13, 19     16

【讨论】:

【参考方案3】:

我们可以使用 rowMeansread.table 来执行此操作 - 使用 read.table 读取列 'y' 以创建两列,并使用 rowMeansbase R 中获取行均值

df$result <- rowMeans(read.table(text=df$y, sep="-", strip.white = TRUE))

-输出

> df
        y x1 x2 result
1 11 - 14 10 31   12.5
2 13 - 17 11 30   15.0
3 13 - 19  8 30   16.0

【讨论】:

【参考方案4】:

基于 R 的另一个选项:

df$y <- do.call(rbind, strsplit(df$y, "-")) |>
  type.convert(as.is = TRUE) |>
  rowMeans()

给出:

> df
     y x1 x2
1 12.5 10 31
2 15.0 11 30
3 16.0  8 30

甚至是另一种选择(虽然不强烈推荐):

df$y <- sapply(sub("-", "+", df$y), \(x) eval(parse(text = x))) / 2

【讨论】:

以上是关于尽可能将字符转换为整数的主要内容,如果未能解决你的问题,请参考以下文章

将字符串转换为整数 [重复]

Haskell:递归地将十六进制字符串转换为整数?

字符串转换整数

将字符串转换为整数参数[重复]

将指针字符串转换为整数

将“整数字符串”转换为整数数组