我想從每個字串中提取最高數值,因為有時該字串將是一個 NA,它將被復制為 NA。
我嘗試了以下解決方案:
df2$val = sapply(strsplit(df2$NomNivelComplej , '\\D '), function(x) max(as.numeric(x)))
但我得到的只是 NA
資料
df2 = structure(list(IdCx = c(47111L, 47111L, 47111L, 47111L, 47108L,
47108L, 47107L, 47107L, 47106L, 47106L), NomNivelComplej = c("De 111 Hasta 130 U.V.R.",
NA, "De 111 Hasta 130 U.V.R.", "De 111 Hasta 130 U.V.R.", "De 91 Hasta 100 U.V.R.",
"De 131 Hasta 150 U.V.R.", "De 31 Hasta 40 U.V.R.", "De 71 Hasta 80 U.V.R.",
"De 111 Hasta 130 U.V.R.", "De 111 Hasta 130 U.V.R.")), row.names = c(NA,
10L), class = "data.frame")
uj5u.com熱心網友回復:
只需添加na.rm = T到您的max函式中,然后用NA.
df2$val <- sapply(strsplit(df2$NomNivelComplej , '\\D '), function(x) max(as.integer(x), na.rm = T))
df2$val <- replace(df2$val, is.infinite(df2$val), NA)
您還可以使用內置函式(取自此處)。
mymax <- function(x) ifelse( !all(is.na(x)), max(x, na.rm=T), NA)
df2$val <- sapply(strsplit(df2$NomNivelComplej , '\\D '), function(x) mymax(as.integer(x)))
輸出:
# > df2
# IdCx NomNivelComplej val
# 1 47111 De 111 Hasta 130 U.V.R. 130
# 2 47111 <NA> NA
# 3 47111 De 111 Hasta 130 U.V.R. 130
# 4 47111 De 111 Hasta 130 U.V.R. 130
# 5 47108 De 91 Hasta 100 U.V.R. 100
# 6 47108 De 131 Hasta 150 U.V.R. 150
# 7 47107 De 31 Hasta 40 U.V.R. 40
# 8 47107 De 71 Hasta 80 U.V.R. 80
# 9 47106 De 111 Hasta 130 U.V.R. 130
# 10 47106 De 111 Hasta 130 U.V.R. 130
uj5u.com熱心網友回復:
一個dplyr和stringr解決方案,不承擔什么塔內字串是什么:
library(stringr)
library(dplyr)
get_max = function(x) {
vals = unlist(str_split(x, "\\D"))
max(as.numeric(vals[vals != ""]))
}
df2 %>% rowwise() %>% mutate(max_val = get_max(NomNivelComplej))
# A tibble: 10 × 3
# Rowwise:
IdCx NomNivelComplej max_val
<int> <chr> <dbl>
1 47111 De 111 Hasta 130 U.V.R. 130
2 47111 NA NA
3 47111 De 111 Hasta 130 U.V.R. 130
4 47111 De 111 Hasta 130 U.V.R. 130
5 47108 De 91 Hasta 100 U.V.R. 100
6 47108 De 131 Hasta 150 U.V.R. 150
7 47107 De 31 Hasta 40 U.V.R. 40
8 47107 De 71 Hasta 80 U.V.R. 80
9 47106 De 111 Hasta 130 U.V.R. 130
10 47106 De 111 Hasta 130 U.V.R. 130
uj5u.com熱心網友回復:
你可以適應所有`length<-`的到3,計算colMaxs(使用matrixStats包中),replace如果is.infinite用NA。
df2$val <- df2$NomNivelComplej |>
strsplit('\\D ') |>
sapply(`length<-`, 3) |>
type.convert(as.is=TRUE) |>
matrixStats::colMaxs(na.rm=TRUE) |>
(\(.) replace(., is.infinite(.), NA))()
df2
# IdCx NomNivelComplej val
# 1 47111 De 111 Hasta 130 U.V.R. 130
# 2 47111 <NA> NA
# 3 47111 De 111 Hasta 130 U.V.R. 130
# 4 47111 De 111 Hasta 130 U.V.R. 130
# 5 47108 De 91 Hasta 100 U.V.R. 100
# 6 47108 De 131 Hasta 150 U.V.R. 150
# 7 47107 De 31 Hasta 40 U.V.R. 40
# 8 47107 De 71 Hasta 80 U.V.R. 80
# 9 47106 De 111 Hasta 130 U.V.R. 130
# 10 47106 De 111 Hasta 130 U.V.R. 130
注: R >= 4.1 使用
資料:
df2 <- structure(list(IdCx = c(47111L, 47111L, 47111L, 47111L, 47108L,
47108L, 47107L, 47107L, 47106L, 47106L), NomNivelComplej = c("De 111 Hasta 130 U.V.R.",
NA, "De 111 Hasta 130 U.V.R.", "De 111 Hasta 130 U.V.R.", "De 91 Hasta 100 U.V.R.",
"De 131 Hasta 150 U.V.R.", "De 31 Hasta 40 U.V.R.", "De 71 Hasta 80 U.V.R.",
"De 111 Hasta 130 U.V.R.", "De 111 Hasta 130 U.V.R.")), row.names = c(NA,
10L), class = "data.frame")
uj5u.com熱心網友回復:
你可以這樣做:
temp <- c()
for (i in df2$NomNivelComplej) {
j <- max(as.numeric(unlist(regmatches(i, gregexpr("[[:digit:]] ", i)))), na.rm = T)
temp <- c(temp, j)
}
df2 <- cbind(df2, temp)
輸出:
IdCx NomNivelComplej temp
1 47111 De 111 Hasta 130 U.V.R. 130
2 47111 <NA> -Inf
3 47111 De 111 Hasta 130 U.V.R. 130
4 47111 De 111 Hasta 130 U.V.R. 130
5 47108 De 91 Hasta 100 U.V.R. 100
6 47108 De 131 Hasta 150 U.V.R. 150
7 47107 De 31 Hasta 40 U.V.R. 40
8 47107 De 71 Hasta 80 U.V.R. 80
9 47106 De 111 Hasta 130 U.V.R. 130
10 47106 De 111 Hasta 130 U.V.R. 130
注意:它-Inf在 的情況下回傳NA。但是,你總是可以照顧它。
uj5u.com熱心網友回復:
您可以利用字串最高值始終跟隨“Hasta”這一事實:
library(stringr)
library(dplyr)
df2 %>%
mutate(max = str_extract(NomNivelComplej, "(?<=Hasta )\\d "))
IdCx NomNivelComplej max
1 47111 De 111 Hasta 130 U.V.R. 130
2 47111 <NA> <NA>
3 47111 De 111 Hasta 130 U.V.R. 130
4 47111 De 111 Hasta 130 U.V.R. 130
5 47108 De 91 Hasta 100 U.V.R. 100
6 47108 De 131 Hasta 150 U.V.R. 150
7 47107 De 31 Hasta 40 U.V.R. 40
8 47107 De 71 Hasta 80 U.V.R. 80
9 47106 De 111 Hasta 130 U.V.R. 130
10 47106 De 111 Hasta 130 U.V.R. 130
在base R:
library(stringr)
df2$max <- str_extract(df2$NomNivelComplej, "(?<=Hasta )\\d ")
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/399282.html
