我在其中一个字段中读取了带有“3:29”的csv文件(不带引号)。这是一个因素。如何将其转换为数字向量,例如C(3:29)?我尝试了as.vector()但这给了一个字符串向量“3,4,5,6 ... 29”(带引号,仍然是字符类)。
编辑答案需要适用于更一般的形式,例如,列可能包含3:6,7,9:11,需要转换为等效的c(3:6,7,9:11) )。
答案 0 :(得分:10)
你可以这样做:
> eval(parse(text='3:29'))
[1] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
[26] 28 29
答案 1 :(得分:2)
拆分:
上的字符串并转换为数字矢量并手动生成对seq()
的调用:
> vars <- as.numeric(strsplit("3:29", ":")[[1]])
> seq(from = vars[1], to = vars[2], by = 1)
[1] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
[26] 28 29
或稍微优雅一点,让R直接构建对`:()`
的调用:
> do.call(`:`, as.list(as.numeric(strsplit("3:29", ":")[[1]])))
[1] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
[26] 28 29
[根据修改更新到原始版本Q]
本着以下精神:
> require(fortunes)
> fortune(106)
If the answer is parse() you should usually rethink the question.
-- Thomas Lumley
R-help (February 2005)
这是我可以在不使用parse()
的情况下获得的:
unlist(lapply(strsplit(strsplit(txt, ",")[[1]], ":"),
function(x) {
x <- as.numeric(x)
if(length(x) == 2) {
seq(x[1], x[2], by = 1) ## `:`(x[1], x[2])
} else {
x[1]
}
}))
得到以下特性:
[1] 3 4 5 6 7 9 10 11
...但是,这可能是使用parse()
可能有意义的时候之一; - )