R字符因子与数字向量
问题描述:
我在其中一个字段(不带引号)中使用“3:29”读取csv文件。这是一个因素。我怎样才能将其转换为数字向量C(3:29)?我试过as.vector(),但是这给了一个字符串向量“3,4,5,6 ... 29”(带引号,仍然是字符类)。R字符因子与数字向量
编辑答案需要适用于更一般的形式,例如,列可以包含3:6,7,9:11,需要将其转换为等效的c(3:6,7,9: 11)。
答
你可以这样做:
> 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
答
拆分上:
串并转换为数字组成的矢量,并生成由手调用seq()
:通过让R键呼叫建立到`:()`
直接
> 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
或稍微更优雅:
> 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()
可能有意义的那些时间之一;-)
需要照顾的具体问题,而不是更普遍的问题,例如,该列还可以包含3:6,7,9:11,这需要转换相当于c(3:6,7,9:11)。 – Benjamin 2011-01-25 15:18:23
不道歉,因为不是通灵;-) – 2011-01-25 15:30:41