我有一个字符串,其值如下所示,由竖线分隔。
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)
我们可以做一个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类,则不需要
否则,如果我们使用scan或eval(parse,则应该为每个元素完成。
| 归档时间: |
|
| 查看次数: |
971 次 |
| 最近记录: |