【问题标题】:How to convert to numeric a sequence saved as a string?如何将保存为字符串的序列转换为数字?
【发布时间】:2020-04-11 04:25:32
【问题描述】:

如何将保存为字符串的序列转换为数字?

让我们有字符串"3:7"。我想获得c(3,4,5,6,7)3:7,无论如何,R 将这些数据读取为数字,而不是字符串。

如果我这样做as.numeric("3:7"),我会得到NA。 R中是否有任何简单的方法或功能可以做到这一点?

一个更复杂的例子:

rec_pairs <- list(c("3:7", "1"), c("2,1", "3"), c("NA", "5"), c("6", "NA"))

我有兴趣获取列表向量的第一个组件中的所有不同元素,即3,4,5,6,7,2,1,NA,6

【问题讨论】:

  • 只想指出,编辑后的示例与原始示例有很大不同。另外,如果你有 6 两次,你如何定义不同的?
  • 关于“distinct”观察,你是对的,这是一个坏例子(6个都应该只计算一次)
  • 不过以后用unique这不是问题@
  • 是的,但是如果您给出的示例与您描述的不符,那么不清楚采用唯一值实际上会满足您的需求

标签: r string numeric


【解决方案1】:

我们可以使用eval(parse

eval(parse(text = "3:7"))

split 并转换使用seq

Reduce(`:`, scan(text="3:7", sep=":", what = numeric()))

基于新数据

unlist(sapply(rec_pairs, function(x) lapply(strsplit(x[1], "[,:]"), 
       function(y) Reduce(`:`, as.list(as.numeric(y))))))
#[1]  3  4  5  6  7  2  1 NA  6

【讨论】:

  • 谢谢@akrun。我在应用sapply 的表达式结果的字符向量中有"3:7"。我应该在回答stackoverflow.com/a/24975243/997979 之后添加另一个sapply 来评估表达式的完整向量还是有更短的方法?谢谢!
  • @iago 您可以将strsplit 用于list,然后对每个元素执行Reduce。请用基准检查时间
  • 根据您的指示,我尝试使用Reduce(:, strsplit(sapply(rec_pairs, function(i) i[1]), split = ",", fixed = TRUE)) 添加到我的问题中的较新示例,但出现错误。
  • @iago strsplit 返回一个字符串。此外,它可以直接应用于rec_pairslapply(strsplit(rec_pairs, ",", fixed = TRUE), function(x) Reduce(:, as.list(as.numeric(x))))
  • 它给了我一个错误:rec_pairs 是一个列表,strsplit 仅适用于向量。此外,我不希望 rec_pairs 中的所有元素
【解决方案2】:

@akrunevalparse 方法将是最有效的方法。这是base R 的另一个解决方案:

v <- as.numeric(unlist(strsplit("3:7",":")))
s <- seq(v[1],v[2])

这样

> s
[1] 3 4 5 6 7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2018-02-15
    相关资源
    最近更新 更多