如果在當前值中找到特定字符,我想用 NA 替換特定行中的值,如果值包含“<”(小于),則 fe“<7.5”我想用 NA 替換整個值.
例子:
Column A: 3, 4, 8, <5.6, 1, 3
Column B: 7, 4, <6, 1, <2.2, 8
應轉換為:
Column A: 3, 4, 8, NA, 1, 3
Column B: 7, 4, NA, 1, NA, 8
我在這里找到了這個例子(https://dplyr.tidyverse.org/reference/na_if.html),帶有 mutate 和 na_if(),但它需要匹配整個字串,fe
y <- c("abc", "def", "", "ghi")
na_if(y, "def")
所以“def”將被NA取代。但如果我使用
y <- c("abc", "def", "", "ghi")
na_if(y, "ef")
什么都沒有被取代。還有一個例子
library(dplyr)
data <- starwars
data %>%
select(name, eye_color) %>%
mutate(name = na_if(name, "Luke Skywalker")) %>%
mutate(eye_color = na_if(eye_color, "unknown")) -> dataedited
這段代碼非常適合我,但也需要精確匹配,而不僅僅是字串的一部分。這樣我就可以手動編輯每一列,也許有一種方法可以跨多列執行此操作。如果名稱包含“天空”或眼睛包含“unkn”,我想將值轉換為 NA。
誰能幫我?
謝謝!
uj5u.com熱心網友回復:
中的na_if元素不會超過一個y。我們可以創建一個邏輯向量 inreplace來替換 的值NA。對于多列,使用across
library(dplyr)
data <- data %>%
mutate(across(c(name, eye_color),
~ replace(., . %in% c("Luke Skywalker", "unknown"), NA)))
對于部分匹配,使用regexinstr_detect或grepl
library(stringr)
data <- data %>%
mutate(across(c(name, eye_color),
~ replace(., str_detect(., "sky|unkn"), NA)))
uj5u.com熱心網友回復:
只需將列轉換為數字,非數字的組件將轉換為 NA。這將產生警告,但它們可以被抑制。
或者,在下面的第二種方法中,檢查是否有非數字非點,并使用 NA 表示這些,然后轉換為數字,在這種情況下,首先不會有警告。
第三種方法是相同的,只是它假設要轉換為 NA 的值都包含<。
第四種方法將任何以 < 開頭的組件替換為 <,然后使用na_if.
x <- c(7, 4, "<6", 1, "<2.2", 8)
# 1
suppressWarnings(as.numeric(x))
## [1] 7 4 NA 1 NA 8
# 2
as.numeric(ifelse(grepl("[^0-9.]", x), NA, x))
## [1] 7 4 NA 1 NA 8
# 3
as.numeric(ifelse(grepl("<", x), NA, x))
## [1] 7 4 NA 1 NA 8
# 4
library(dplyr)
as.numeric(na_if(sub("<.*", "<", x), "<"))
## [1] 7 4 NA 1 NA 8
uj5u.com熱心網友回復:
我還發現它na_if()不夠靈活,所以我經常使用我自己的版本na_predicate()。它有兩個引數:要編輯的向量和回傳TRUEor的謂詞函式FALSE。
對于您的情況,您可以將其與 dplyr 的across(),結合使用以編輯多列。
library(dplyr)
library(stringr)
na_predicate <- function(x, fn) {
predicate <- rlang::as_function(fn)
x[predicate(x)] <- NA
x
}
# Example of a simple predicate function. By default, it's applied to the vector
# to change
is_even <- function(x) x %% 2 == 0
na_predicate(1:10, is_even)
#> [1] 1 NA 3 NA 5 NA 7 NA 9 NA
# But you can use the formula notation to make it apply to something else
# instead
na_predicate(c("a", "b", "c", "d"), ~ is_even(1:4))
#> [1] "a" NA "c" NA
# Applying it to starwars data. Here's the original:
original_data <- starwars %>%
select(name, eye_color, skin_color) %>%
head() %>%
print()
#> # A tibble: 6 x 3
#> name eye_color skin_color
#> <chr> <chr> <chr>
#> 1 Luke Skywalker blue fair
#> 2 C-3PO yellow gold
#> 3 R2-D2 red white, blue
#> 4 Darth Vader yellow white
#> 5 Leia Organa brown light
#> 6 Owen Lars blue light
# And here I'm using na_predicate() to turn any value in the name/eye_color
# columns that contains an "l" into NA:
original_data %>%
mutate(across(c(name, eye_color),
na_predicate, ~ str_detect(., "l")))
#> # A tibble: 6 x 3
#> name eye_color skin_color
#> <chr> <chr> <chr>
#> 1 <NA> <NA> fair
#> 2 C-3PO <NA> gold
#> 3 R2-D2 red white, blue
#> 4 Darth Vader <NA> white
#> 5 Leia Organa brown light
#> 6 Owen Lars <NA> light
由reprex 包(v2.0.1)于 2021 年 11 月 9 日創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/354141.html
