gpt4 book ai didi

r - 对字符串中字符之前出现的数字求和,但紧接在前的数字除外

转载 作者:行者123 更新时间:2023-12-04 16:36:36 25 4
gpt4 key购买 nike

我有一些字符串 (CIGAR),我试图对 “I” 之前的数字之前出现的数字求和。 “I” 出现的位置变化很大,但前面总是有一个数字。这是一个示例 df:

df <- data.frame(String = c("220M1I","10I200M","5M2D1I20M","22M5D2M3I5M"))

我想要的输出如下:

       String Sum_prior
1 220M1I 220
2 10I200M 0
3 5M2D1I20M 7
4 22M5D2M3I5M 29

我有一个部分解决方案无法处理 “I” 之前的 >1 位数字,这是有问题的。

    sum_fun <- function(x) {
str_match_all(x, "\\d+(?!I)") %>%
unlist() %>%
as.numeric() %>%
sum()
}

然后申请 df:

df <- df %>% rowwise() %>% mutate(output = sum_fun(String))
df



String output
<chr> <dbl>
1 220M1I 220 #Good
2 10I200M 201 #The 1 in 10 is being included
3 5M2D1I20M 27 #Don't want last 20 included
4 22M5D2M3I5M 34 #Don't want last 5 included

但我不知道如何调整正则表达式以忽略 “I” 之前的所有数字,并对 “I” 之前的所有其他数字求和。

我需要一个更高级的例子(但不太重要),当有多个 "I" 时计算累积数 - 第一次出现如上 (output_1),但是第二个(或更多)(output_2) 示例包括前面的 “I” 数字。

df2 <- data.frame(String =c("5M10I200M20I","100M2D3I105M1I10M")


String Output_1 Output_2
1 5M10I200M20I 5 215
2 100M2D3I105M1I10M 102 210

感谢任何帮助。

最佳答案

这是一个基本的 R 方法:

df <- data.frame(String = c("220M1I","10I200M","5M2D1I20M","22M5D2M3I5M"))
x <- sub("\\d+I.*$", "", df$String)
df$Sum_prior <- sapply(strsplit(x, "\\D"), function(y) sum(as.numeric(y)))
df

String Sum_prior
1 220M1I 220
2 10I200M 0
3 5M2D1I20M 7
4 22M5D2M3I5M 29

这里的策略是先剥离数字,然后是I,直到字符串结束。然后,我们对非数字数字进行字符串拆分,以生成一个字符串数字向量。最后,我们将这些数字相加得到最终结果。

关于r - 对字符串中字符之前出现的数字求和,但紧接在前的数字除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69187047/

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