R中字符串中的数字之和由垂直条分隔

时间:2016-12-15 05:40:58

标签: r regex sum

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

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

2 个答案:

答案 0 :(得分:4)

我们可以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

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

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

如果我们有一个包含字符串的data.frame列,那么最好将|拆分为listvector,转换{{1} } {s}到vector(所有非数字元素都会通过友好警告强制转移到numeric),使用NA获取sum

na.rm=TRUE

注意:如果'chk'列已经是sapply(strsplit(as.character(chk$chk), "[|]"), function(x) sum(as.numeric(x), na.rm=TRUE)) #[1] 100 100 6 0

,则不需要as.character

否则,如果我们使用characterscan,则应为每个元素执行此操作。

答案 1 :(得分: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