字符串中的和号(R)

时间:2018-01-17 10:53:36

标签: r vector sum

我的矢量看起来像:

numbers <- c("1/1/1", "1/0/2", "1/1/1/1", "2/0/1/1", "1/2/1")

(并非总是使用相同数量的“/”字符)

如何使用每个字符串的数字之和创建另一个向量?

类似的东西:

sum
3
3
4
4
4

3 个答案:

答案 0 :(得分:2)

strsplitsapply的一个解决方案:

sapply(strsplit(numbers, '/'), function(x) sum(as.numeric(x)))
#[1] 3 3 4 4 4

strsplit会在/上将您的蜇伤分开(不管您拥有多少/strsplit的输出是一个列表,因此我们迭代它以使用sapply计算总和。

答案 1 :(得分:2)

在我看来,最简单的方法是将您的数字字符串转换为实际有效的字符串算术表达式,然后使用evalparse在R中对它们进行评估。因此,字符串1/0/2将变为1+0+2,然后我们可以简单地评估该表达式。

sapply(numbers, function(x) { eval(parse(text=gsub("/", "+", x))) })

1/1/1   1/0/2 1/1/1/1 2/0/1/1   1/2/1 
    3       3       4       4       4 

Demo

答案 2 :(得分:0)

1)strapply strapply使用\\d+匹配每个数字字符串,然后将as.numeric应用于它,返回一个列表,每个输入字符串包含一个数字向量。然后,我们将sum应用于每个向量。这个解决方案似乎特别短。

library(gsubfn)

sapply(strapply(numbers, "\\d+", as.numeric), sum)
## [1] 3 3 4 4 4

2)read.table 这会将sum(read.table(...))应用于每个字符串。它有点长(但仍然只有一行代码)但不使用包。

sapply(numbers, function(x) sum(read.table(text = x, sep = "/")))
##   1/1/1   1/0/2 1/1/1/1 2/0/1/1   1/2/1 
##       3       3       4       4       4 

如果您不想在输出中输入姓名,请将USE.NAMES = FALSE参数添加到sapply

scan(textConnection(x), sep = "/", quiet = TRUE)可用于代替read.table但更长。