【问题标题】:Sum number in a character string (R)字符串中的总和 (R)
【发布时间】:2026-01-03 03:30:01
【问题描述】:

我有一个看起来像这样的向量:

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

【问题讨论】:

  • 还有Reduce(`+`, data.table::tstrsplit(numbers, "/", fixed = TRUE, type.convert = TRUE, fill = 0))
  • @DavidArenburg 将此作为答案,它非常优雅!

标签: r vector sum


【解决方案1】:

strsplitsapply 的一个解决方案:

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

strsplit 会在/ 上分裂你的刺(不管你有多少/s)。 strsplit 的输出是一个列表,因此我们对其进行迭代以计算与 sapply 的总和。

【讨论】:

  • 感谢您的速度和准确的回答,你拯救了我的一天。
  • 乐于助人:)
【解决方案2】:

在我看来,这里最直接的方法是将数字字符串转换为实际有效的字符串算术表达式,然后在 R 中使用evalparse 对它们进行评估。因此,字符串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

【讨论】:

    【解决方案3】:

    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,但更长。

    【讨论】:

      最近更新 更多