簡體   English   中英

將貨幣字符串值重新編碼為數字的新變量

[英]Recode monetary string values into new variable as numeric

首先 - R 新手,所以請耐心等待。 我正在嘗試將字符串值重新編碼為數字。 我的問題是我的值中有兩種不同的字符串模式:“M”和“B”分別代表“百萬”和“十億”。

df <- (funds = c($1.76M, $2B, $57M, $9.87B)

我已經成功敲掉了美元符號,現在有:

df <- (funds = c($1.76M, $2B, $57M, $9.87B),
       fundsR = c(1.76M, 2B, 57M, 9.87B)
       )

如何在保留它們各自的貨幣價值的同時將它們重新編碼為數字? 我嘗試使用各種 if 語句、for 循環、帶或不帶 str_detect、管道運算符、case_when、mutate 等來隔離帶有“M”的值和帶有“B”的值,轉換為數字並相乘以得出互補數值——全部在一個新列中。 這個看似簡單的任務結果並不像我想象的那么簡單,我將其歸因於新手。 在這一點上,我想從頭開始,看看是否有人有任何新的想法。 我的 Rstudio 是一團糟。

像這樣的東西會很好:

df <- (funds = c($1.76M, $2B, $57M, $9.87B),
       fundsR = c(1.76M, 2B, 57M, 9.87B),
       fundsFinal = c(1760000, 2000000000, 57000000, 9870000000)
       )

我非常感謝您的意見。

您可以創建一個輔助函數f ,然后將其應用於funds列:


library(dplyr)
library(stringr)

f <- function(x) {
  curr = c("M"=1e6, "B" = 1e9)
  val = str_remove(x,"\\$")
  as.numeric(str_remove_all(val,"B|M"))*curr[str_extract(val, "B|M")]
}

df %>% mutate(fundsFinal = f(funds))

輸出:

   funds fundsFinal
1 $1.76M   1.76e+06
2    $2B   2.00e+09
3   $57M   5.70e+07
4 $9.87B   9.87e+09

輸入:

df = structure(list(funds = c("$1.76M", "$2B", "$57M", "$9.87B")), class = "data.frame", row.names = c(NA, 
-4L))

這可行,但我確信存在更好的解決方案。 假設funds是一個特征向量:

library(tidyverse)
options(scipen = 999)
df <- data.frame(funds = c('$1.76M', '$2B', '$57M', '$9.87B'))


df = df %>%
  mutate( fundsFinal = ifelse(str_sub(funds,nchar(funds),-1) =='M',
                          as.numeric(substr(funds, 2, nchar(funds) - 1))*10^6,
                          as.numeric(substr(funds, 2, nchar(funds) - 1))*10^9))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM