我的虛擬代碼:
x <- c("A", "B", "C", "D")
y <- c("<0.5", "~1", "<10", "~30")
df <- data.frame(x,y) %>%
mutate(y1 = str_replace(y, "~", ""),
y2 = as.numeric(str_replace(y1, "<", ""))/2)
基本上我想在 y 列中做的是:
- 從包含“~”的值中洗掉“~”
- 從包含“<”的值中洗掉“<”,然后將這些值減半
理想情況下,我會提出一個全數字列。
如何在不需要臨時“y1”變數的情況下執行此步驟?我試過將兩者都放入 str_replace 但似乎不起作用,或者創建了 NA。我也試過在 str_replace 內管道,但這也不起作用。注意我只希望“<”值減半。
謝謝。
uj5u.com熱心網友回復:
我們可以通過 OR 運算子連接幾個洗掉條件:
library(tidyverse)
df <- data.frame(x = c("A", "B", "C", "D"),
y = c("<0.5", "~1", "<10", "~30"))
df %>%
mutate(y2 = as.numeric(str_remove(y, "<|~")),
y2 = if_else(str_detect(y, '<'), 0.5 * y2, y2))
這使:
x y y2
1 A <0.5 0.25
2 B ~1 1.00
3 C <10 5.00
4 D ~30 30.00
通過覆寫 y 更新解決方案:
df %>%
mutate(y = if_else(str_detect(y, '<'), 0.5 * as.numeric(str_remove(y, "<|~")), as.numeric(str_remove(y, "<|~"))))
這使:
x y
1 A 0.25
2 B 1.00
3 C 5.00
4 D 30.00
當然,您也可以從解決方案 1 中洗掉舊的 y 列并將 y2 重命名為 y。
uj5u.com熱心網友回復:
更新:見op評論:
library(tidyverse)
df %>%
mutate(y = ifelse(str_detect(y, "<"), parse_number(y)/2, parse_number(y)))
x y
1 A 0.25
2 B 1.00
3 C 5.00
4 D 30.00
@deschen 的回答很好。另一種方法是使用parse_numberfromreadr包:
library(tidyverse)
df %>%
mutate(y2 = ifelse(str_detect(y, "<"), parse_number(y)/2, parse_number(y)))
x y y2
1 A <0.5 0.25
2 B ~1 1.00
3 C <10 5.00
4 D ~30 30.00
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/372991.html
上一篇:帶有動態URL的R函式
