【问题标题】:How to extract - sign from tail and place it before the number如何提取 - 从尾部签名并将其放在数字之前
【发布时间】:2020-06-19 17:55:57
【问题描述】:

我得到一个 .txt 文件,该文件在数字末尾带有符号。

当我尝试将其转换为数字时,-ve 值会变成 NA,因为数据是字符格式。我什至尝试过,标记那些 -ve 值并将标记值乘以“-1”。

因为我有大约 25 个这样的专栏。它变得越来越复杂。 任何人都可以建议我这样做的简单方法。

下面是我准备的样本数据,

R1 <- c("15515.88-","5156.04","65656","1566.1-")
R2 <- c("515","5156.11-","415-","1455-")
R3 <- c("123.14-","9875-","1247-","778.04-")
df <- data.frame(R1,R2,R3)

我的预期输出是初始的 -ve 符号,

    R1         R2        R3
-15515.88     515      -123.14
 5156.04     -5156.11  -9875
 65656       -415      -1247
-1566.1      -1455     -778.04

需要您的帮助

【问题讨论】:

  • 您要转换为数字还是保留为字符?
  • 我需要将其转换为数字以便进一步计算,因为它是一个 BI 项目
  • @Vin 请考虑接受任何最适合您的答案。

标签: r dplyr tidyverse


【解决方案1】:

在基础 R 中,您可以使用 lapply 使用正则表达式一次处理一列并转换为数字。

df[] <- lapply(df, function(x) as.numeric(sub("(.+)(-)", "\\2\\1", x)))
df

#          R1       R2       R3
# 1 -15515.88   515.00  -123.14
# 2   5156.04 -5156.11 -9875.00
# 3  65656.00  -415.00 -1247.00
# 4  -1566.10 -1455.00  -778.04

【讨论】:

  • @sindri 嗨,知道为什么df[] &lt;- lapply(df, function(x) as.numeric(sub("(\\d+\\.\\d+)-", "-\\1", x))) 通过强制引入 NA 吗?
  • @ChrisRuehlemann 你假设\\d+\\.\\d+ 格式。但其中一些不包含 . 所以你的正则表达式什么都不做......
【解决方案2】:

基础 R 中的一个解决方案是

df[] <- lapply(df, function(x) {as.numeric(ifelse(grepl("-", x), paste0("-", gsub("-", "", x)), x))})

基本上它的工作方式如下:如果存在-,则将其删除并在值的开头添加另一个-,然后将列转换为数字。

输出

#          R1       R2       R3
# 1 -15515.88   515.00  -123.14
# 2   5156.04 -5156.11 -9875.00
# 3  65656.00  -415.00 -1247.00
# 4  -1566.10 -1455.00  -778.04

【讨论】:

    【解决方案3】:
    rep.format <- function(num){
      ind <- grepl("-", num)
      num[ind] <-  paste0("-", sub("-", "", num[ind]), "")
      num
    }
    
    R1 <- c("15515.88-","5156.04","65656","1566.1-")
    R2 <- c("515","5156.11-","415-","1455-")
    R3 <- c("123.14-","9875-","1247-","778.04-")
    
    df <- data.frame(rep.format(R1),rep.format(R2),rep.format(R3))
    df
    

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 2021-06-22
      • 2010-09-30
      • 2017-06-14
      相关资源
      最近更新 更多