【问题标题】:Sum of Numbers in string in R separated by Vertical BarR中字符串中的数字总和由垂直条分隔
【发布时间】:2016-12-15 05:40:58
【问题描述】:

我有一个字符串,其值如下所示,由竖线分隔。

String1 <- "5|10|25|25|10|10|10|5"
String2 <- "5|10|25|25"

是否有任何直接函数来获取字符串中数字的总和, 在这种情况下,Srting1 应该是 100,string2 应该是 65,我有一个这样的字符向量。

>chk
                chk
1 5|10|25|25|10|10|10|5
2       5|55|20|5|5|5|5
3                     6
4        Not Available
> sum(scan(text=gsub("\\Not Available\\b", "NA", chk$chk), sep="|", what = numeric(), quiet=TRUE), na.rm = TRUE)
[1] 206

应该是这样的

 [1]100 100 6 NA

【问题讨论】:

    标签: r regex sum


    【解决方案1】:

    我们可以先scan 然后sum

    sum(scan(text=String1, sep="|", what = numeric(), quiet=TRUE))
    

    对于多个向量,将其放在list 中并执行相同的操作

    sapply(mget(paste0("String", 1:2)), function(x) 
            sum(scan(text=x, sep="|", what=numeric(), quiet=TRUE)))
    # String1 String2 
    #    100      65 
    

    在将| 替换为+ 之后,另一个选项是eval(parse((虽然不推荐)

    eval(parse(text=gsub("[|]", "+", String1)))
    #[1] 100
    

    或者如 cmets 中提到的 @thelatemail,将 (&lt;-) 分配给 |+,然后执行 eval(parse(..

    `|` <- `+`
    eval(parse(text=String1))
    #[1] 100
    

    如果我们有一个带有字符串的data.frame 列,那么最好将| 拆分为vectors 的list,将vectors 转换为numeric(所有非-numeric 元素强制转换为 NA 并带有友好警告),获取 sumna.rm=TRUE

    sapply(strsplit(as.character(chk$chk), "[|]"), 
         function(x) sum(as.numeric(x), na.rm=TRUE))
    #[1] 100 100   6   0
    

    注意:如果“chk”列已经是character 类,则不需要as.character

    否则,如果我们使用scaneval(parse,则应该对每个元素都这样做。

    【讨论】:

    • 谢谢@akrun,Preety Fast :)
    • 为什么不真正滥用eval(parse...? - `|` &lt;- `+`; eval(parse(text=String1)) :-)
    • @Shivpe_R 可以使用,确保列是character类而不是factor。如果是factor,则转换为character,即。 sum(scan(text= as.character(Dataset$Column)..
    • @Shivpe_R 您必须对新数据集中的每个元素执行此操作,即 apply(chk, 1, FUN = function(x) sum(scan(text=gsub...
    • 这工作,谢谢
    【解决方案2】:

    我们可以从字符串中提取所有数字,然后sum覆盖它

    library(stringr)
    sum(as.numeric(unlist(str_match_all(String1, "[0-9]+"))))
    #[1] 100
    
    sum(as.numeric(unlist(str_match_all(String2, "[0-9]+"))))
    #[1] 65
    

    对于多个向量,我们可以将其保存在一个列表中

    sapply(list(String1, String2), function(x) 
                                      sum(as.numeric(unlist(str_match_all(x, "[0-9]+")))))
    #[1] 100  65
    

    【讨论】:

      猜你喜欢
      • 2019-01-07
      • 2021-02-28
      • 1970-01-01
      • 2016-11-02
      • 2018-06-26
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多