gpt4 book ai didi

r - 从字符串中提取数字,如果它后跟 R 中的某些字符

转载 作者:行者123 更新时间:2023-12-02 07:59:03 26 4
gpt4 key购买 nike

我有一个数据框,其中包含一个包含不同测量单位的食物数量的变量。数据框包含约 11000 个观察值。

让我举个例子:“10 克 peterselie、7 克外观、5 克 kruiden en 400 克肉汤、2 汤匙橄榄油、1 盎司番茄酱、20 颗葡萄、1 颗红辣椒粉”

我找到了一种方法来提取数字并将它们相加,使用这个函数:

sum_numerics <- function(x) {

# Grab all numbers that appear
matches <- str_match_all(x, "[0-9]+")

# Grab the matches column in the list, transform to numeric, then sum
sapply(matches, function(y) sum(as.numeric(y)))

}

我正在寻找一种方法来提取所有以克为单位的食物数量,并将它们写入一个新变量,以便在下一步中对它们求和。我花了一些时间寻找方法来做到这一点,并花了一些时间用 regex-demo 解决问题。 ,但我找不到有效的解决方案,而且我真的不知道如何编写有效的正则表达式函数。我真丢人!

用户“Max Teflon”提供了一个可能的解决方案,经过更多调查后看起来像这样:

get_gramms <- function(x) {

# Grab all numbers that appear
str_extract_all(x, "([0-9]+\\s?([gG]|[gGrRaAmM]{5,6}|[gGrRaAmM]{2}))") %>% # any number followed by an optional space and a small/capital g%>%

unlist() %>%

str_remove_all('[[:alpha:]]') %>% # a vector is what we want

str_trim() %>% # remove all trailing whitespaces

as.numeric() # change to numbers

}

x %>%
mutate(var = map(var,~get_gramms(.))) %>%
mutate(var = map_dbl(var,~ifelse(length(.)>0,sum(.),NA)))

我认为他的回答接近于解决我的问题,但它仍然返回错误的值,例如“1 gelbe Paprika”。

期待新的想法、解决方案!

最佳答案

也许你可以尝试下面的代码,使用来自 base R 的 gsub() + regmatches() + gregexpr()

r <- sum(as.numeric(gsub("(\\d+).*",
"\\1",
unlist(regmatches(s,gregexpr("\\d+\\s?(g|gr|grams|gram)\\b",s,ignore.case = T))))))

这样

> r
[1] 422

数据

s <- "10gr peterselie, 7 Grams look, 5g kruiden en 400GRAMM bouillon, 2 tbsp olive-oil, 1oz ketchup"

编辑:如果你想沿着一列进行操作,也许你可以像下面那样做

f <- Vectorize(function(s) {
sum(as.numeric(gsub("(\\d+).*",
"\\1",
unlist(regmatches(s,gregexpr("\\d+\\s?(g|gr|grams|gram)\\b",s,ignore.case = T))))))
}
)

df <- within(df, y <- f(x))
df <- within(df, y <- ifelse(y==0,NA,1))

关于r - 从字符串中提取数字,如果它后跟 R 中的某些字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59752944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com