我在表单的某些文本中有一个字符串"12,34,77"
,包括引号。
我需要将每个数字的值放入一个列表中。我尝试使用lapply
和strsplit
:
control2=lapply(strsplit(data$values,","),as.numeric)
但我得到了错误:
非字符参数
我究竟做错了什么?
1) 绑带
1a) scalar这是一个使用strapply
gsubfn 包的单行代码:
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)
我认为您的问题可能源于您的源数据。无论如何,如果您想使用数字,您将摆脱引号。我推荐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
试试这个:
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
正如已经指出的那样,您需要先正则表达式输出引号。
destring
库中的函数taRifx
将执行此操作(删除任何非数字字符),然后强制转换为数字:
test <- '"12,34,77"'
library(taRifx)
lapply(strsplit(test,","),destring)
[[1]]
[1] 12 34 77