1

我在表单的某些文本中有一个字符串"12,34,77",包括引号。

我需要将每个数字的值放入一个列表中。我尝试使用lapplystrsplit

control2=lapply(strsplit(data$values,","),as.numeric)

但我得到了错误:

非字符参数

我究竟做错了什么?

4

4 回答 4

10

1) 绑带

1a) scalar这是一个使用strapplygsubfn 包的单行代码:

library(gsubfn)
x <- '"12,34,567"'

strapply(x, "\\d+", as.numeric, simplify = c)
## [1]  12  34 567

1b)矢量化矢量化版本更简单——只需删除simplify=c以下内容:

v <- c('"1,2,3"', '"8,9"') # test data
strapply(v, "\\d+", as.numeric)`

2) gsub 和扫描

2a) 标量和这里是一个使用gsub和的单线性scan

scan(text = gsub('"', '', x), what = 0, sep = ",")
## Read 3 items
## [1]  12  34 567

2b)矢量化矢量化版本将涉及lapply对组件的 -ing:

lapply(v, function(x) scan(text = gsub('"', '', x), what = 0, sep = ","))

3)strsplit

3a)标量,这是一个strsplit解决方案。请注意,我们对"和进行了拆分,

as.numeric(strsplit(x, '[",]')[[1]][-1])
## [1]  12  34 567

3b)矢量化矢量化解决方案将再次涉及lapply对组件的处理:

lapply(v, function(x) as.numeric(strsplit(x, '[",]')[[1]][-1]))

3c)矢量化 - 更简单或更简单:

lapply(strsplit(gsub('"', '', v), split = ","), as.numeric)
于 2012-07-13T16:47:43.380 回答
4

我认为您的问题可能源于您的源数据。无论如何,如果您想使用数字,您将摆脱引号。我推荐gsub

> x <- '"1,3,5"'
> x
[1] "\"1,3,5\""
> x <- gsub("\"", "", x)
> x
[1] "1,3,5"
> as.numeric(unlist(strsplit(x, ",")))
[1] 1 3 5
于 2012-07-13T15:59:00.353 回答
2

试试这个:

x <-  "12,34,77"
sapply(strsplit(x, ",")[[1]], as.numeric, USE.NAMES=FALSE)
[1] 12 34 77

由于 的结果strsplit()是列表列表,因此您需要提取第一个元素并将其传递给lapply().


但是,如果您的字符串确实包含嵌入的引号,则需要先删除嵌入的引号。您可以gsub()为此使用:

x <-  '"12,34,77"'
sapply(strsplit(gsub('"', '', x), ",")[[1]], as.numeric, USE.NAMES=FALSE)
[1] 12 34 77
于 2012-07-13T15:55:42.790 回答
2

正如已经指出的那样,您需要先正则表达式输出引号。

destring库中的函数taRifx将执行此操作(删除任何非数字字符),然后强制转换为数字:

test <- '"12,34,77"'
library(taRifx)
lapply(strsplit(test,","),destring)
[[1]]
[1] 12 34 77
于 2012-07-13T16:27:30.113 回答