【发布时间】:2020-01-15 13:58:10
【问题描述】:
我有一个数据框,其中包含一个变量,其中包含不同测量单位的食物数量。数据框包含约 11000 个观察值。
让我举个例子: “10gr peterselie,7 克外观,5g kruiden en 400GRAMM 肉汤,2 汤匙橄榄油,1oz 番茄酱,20 颗葡萄,1 个gelbe 辣椒粉”
我找到了一种方法来提取数字并总结它们,使用这个函数:
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”。
期待新的想法、解决方案!
【问题讨论】:
-
你想要 10,7,5,400?
-
嘿 Nelson,是的,我想提取每个数字,后面跟 g、gr、g、gramm 或任何人可以表示的 gramms。