R 中字符串中的数字总和由竖线分隔

Shi*_*e_R 2 regex r sum

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

String1 <- "5|10|25|25|10|10|10|5"
String2 <- "5|10|25|25"
Run Code Online (Sandbox Code Playgroud)

是否有任何直接函数来获取 string 中数字的总和,在这种情况下,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
Run Code Online (Sandbox Code Playgroud)

理应如此

 [1]100 100 6 NA
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

我们可以做一个scan然后sum

sum(scan(text=String1, sep="|", what = numeric(), quiet=TRUE))
Run Code Online (Sandbox Code Playgroud)

对于多个vector,放在a中list,做同样的操作

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

另一种选择是eval(parse((不推荐虽然)更换后|+

eval(parse(text=gsub("[|]", "+", String1)))
#[1] 100
Run Code Online (Sandbox Code Playgroud)

或者如评论中提到的@thelatemail,将 ( <-)分配|+,然后执行eval(parse(..

`|` <- `+`
eval(parse(text=String1))
#[1] 100
Run Code Online (Sandbox Code Playgroud)

如果我们有一data.frame列包含字符串,那么最好拆分|为 a listof vectors,将vectors转换为numeric(所有非数字元素都强制转换NA为友好警告),得到sumwithna.rm=TRUE

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

注意:as.character如果 'chk' 列已经是一个character类,则不需要

否则,如果我们使用scaneval(parse,则应该为每个元素完成。