我有一个字符串,其值如下所示,由竖线分隔。
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
答案 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
列,那么最好将|
拆分为list
个vector
,转换{{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
否则,如果我们使用character
或scan
,则应为每个元素执行此操作。
答案 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