簡體   English   中英

R根據字符串值重新編碼列

[英]R recode a column based on a string value

我有一個數據框如下

date     volume
1-1-90    1.1M
2-1-90     200
3-1-90     0.5M
4-1-90    100
5-1-90     1M

M的值表示百萬。 我想檢測其中帶有字母M或m的值,並將這些值轉換為數值等效項

date     volume
1-1-90    1100000
2-1-90     200
3-1-90     500000
4-1-90    100
5-1-90    10000000

在R中有一種不錯的方法嗎?

我使用了ifelse條件,如下所示

(df)[, Volumes := ifelse(volume %in% c("m", "M"),volume * 1000000,0)]

但這似乎不起作用。 我肯定忽略了那一定是微不足道的。

> dat$volume <- ifelse( grepl("M|m" ,dat$volume), 
                             1e6*as.numeric(sub("M|m","", dat$volume)), 
                             as.numeric(as.character(dat$volume) ) )
> dat
    date  volume
1 1-1-90 1100000
2 2-1-90     200
3 3-1-90  500000
4 4-1-90     100
5 5-1-90 1000000

在我看來,就像你有一個data.table對象有(或者也許你錯誤地使用data.table在語法data.frame ?)

無論如何,如果df是一個data.table對象,我會選擇

df[grepl("m", volume, ignore.case = T), 
   volume2 := as.numeric(gsub("m", "", volume, ignore.case = T)) * 1e6]
df[is.na(volume2), volume2 := as.numeric(as.character(volume))][, volume := NULL]
df
#      date volume2
# 1: 1-1-90 1100000
# 2: 2-1-90     200
# 3: 3-1-90  500000
# 4: 4-1-90     100
# 5: 5-1-90 1000000

stringr包也可以在這里工作:

require(stringr)

dat$volume <- ifelse(str_sub(dat$volume, -1) == "M"
                     ,as.numeric(str_sub(dat$volume, 0, nchar(dat$volume)-1))*1000000
                     ,dat$volume)

暫無
暫無

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

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