3

我正在将表格读入表格的 R

SUB DEP
1   ""
2   "1"
3   "1, 2"
4   "1, 2, 3"
5   "1:3, 5"

然后我将 DEP 变量解析为一个数字列表,如下所示:

Dependencies <- read.table("dependencies.txt", header = TRUE,
                           colClasses = c("numeric", "character"),
                           fill = TRUE)
Dependencies$DEP <- strsplit(Dependencies$DEP, ", ")
Dependencies$DEP <- lapply(Dependencies$DEP, as.numeric)

这工作正常,除非正在读取的文件包含一个序列,例如在第 5 行。 as.numeric("1:3")返回NA,而不是 1、2、3。我应该如何将字符串"1:3, 5"转换为数字向量 c(1、2、3、5 )。如果有帮助,我可以更改向量在输入文件中的写入方式。

谢谢您的帮助!迈克尔

4

2 回答 2

8

这是使用可怕eval(parse(...))结构的解决方案:

Dependencies$DEP <- sapply(paste("c(", Dependencies$DEP, ")"), 
                           function(x) eval(parse(text = x)))
Dependencies
#   SUB        DEP
# 1   1       NULL
# 2   2          1
# 3   3       1, 2
# 4   4    1, 2, 3
# 5   5 1, 2, 3, 5
str(Dependencies)
# 'data.frame':  5 obs. of  2 variables:
# $ SUB: int  1 2 3 4 5
# $ DEP:List of 5
# ..$ c(  )       : NULL
# ..$ c( 1 )      : num 1
# ..$ c( 1, 2 )   : num  1 2
# ..$ c( 1, 2, 3 ): num  1 2 3
# ..$ c( 1:3, 5 ) : num  1 2 3 5
于 2013-07-16T06:13:22.633 回答
5

在这种情况下,您可以将您的论点强制转换为dget可以处理的形式

aTxt <- 'SUB DEP
1   ""
2   "1"
3   "1, 2"
4   "1, 2, 3"
5   "1:3, 5
'
Dependencies <- read.table(text = aTxt, header = TRUE,
                           colClasses = c("numeric", "character"),
                           fill = TRUE)
Dependencies$DEP <- sapply(Dependencies$DEP, function(x) dget(textConnection(paste('c(', x, ')'))))

> Dependencies
  SUB        DEP
1   1       NULL
2   2          1
3   3       1, 2
4   4    1, 2, 3
5   5 1, 2, 3, 5
于 2013-07-16T06:23:02.093 回答