【发布时间】:2011-06-15 06:23:50
【问题描述】:
我读入了一个 csv 文件,其中一个字段中包含“3:29”(不带引号)。这是一个因素。如何将其转换为数字向量,例如c(3:29)?我试过 as.vector() 但这给出了一个字符串向量“3,4,5,6...29”(带引号,仍然是字符类)。
EDIT Answer 需要适用于更一般的形式,例如,该列可能包含 3:6,7,9:11,需要将其转换为等效的 c(3:6,7,9:11 )。
【问题讨论】:
我读入了一个 csv 文件,其中一个字段中包含“3:29”(不带引号)。这是一个因素。如何将其转换为数字向量,例如c(3:29)?我试过 as.vector() 但这给出了一个字符串向量“3,4,5,6...29”(带引号,仍然是字符类)。
EDIT Answer 需要适用于更一般的形式,例如,该列可能包含 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
【讨论】:
"3:6,7,9:11"(如问题的编辑形式)你可以把它变成一个函数str2c <- function(s) eval(parse(text=paste("c(", s, ")")))。
在: 上拆分字符串并转换为数字向量并手动生成对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() 可能有意义的时候之一;-)
【讨论】:
parse() 可能是最简单的方法,遵循@Michael Dunn 对@Prasad 的回答的评论。我对parse() 的普遍厌恶导致在我更新的答案中摆在你面前的怪物。顺便说一句,Q 很好(+1)。