我的矢量看起来像:
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
答案 0 :(得分:2)
strsplit
和sapply
的一个解决方案:
sapply(strsplit(numbers, '/'), function(x) sum(as.numeric(x)))
#[1] 3 3 4 4 4
strsplit
会在/
上将您的蜇伤分开(不管您拥有多少/
。 strsplit
的输出是一个列表,因此我们迭代它以使用sapply
计算总和。
答案 1 :(得分:2)
在我看来,最简单的方法是将您的数字字符串转换为实际有效的字符串算术表达式,然后使用eval
和parse
在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
答案 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
但更长。