read.table意外地将“T”解释为TRUE

时间:2013-10-28 20:18:38

标签: r

我发现R似乎将"T"解释为TRUE的问题,即使在使用所有方法避免这样做时(至少根据此post)。

示例数据(保存为“test.txt”):

col1    col2
1   T
2   T
3   T
4   T
5   T
6   T
7   T
8   T
9   T

示例代码:

read.table("test.txt", as.is=TRUE, header=TRUE, 
   stringsAsFactors=FALSE, colClasses=c(character())) 

产地:

  col1 col2
1    1 TRUE
2    2 TRUE
3    3 TRUE
4    4 TRUE
5    5 TRUE
6    6 TRUE
7    7 TRUE
8    8 TRUE
9    9 TRUE

我发现只有非理想的解决方案是设置header = FALSE:

read.table("test.txt", as.is=TRUE, header=FALSE, 
    stringsAsFactors=FALSE,
    colClasses=c(character()))        


     V1   V2
1  col1 col2
2     1    T
3     2    T
4     3    T
5     4    T
6     5    T
7     6    T
8     7    T
9     8    T
10    9    T

我意识到这似乎有点人为,但这个边缘案例是真实的,因为人类基因实际上被命名"T"(!),col1中的值是该基因内的位置。

提前感谢您的帮助

1 个答案:

答案 0 :(得分:7)

是什么让你觉得这是“出人意料”?

R猜测你(这通常很有用),但如果你知道的更好,请使用colClasses=...参数告诉R.

R> res <- read.table(textConnection("col1 col2\n1 T\n2 T\n3 T"), 
+                    header=TRUE, colClasses=c("numeric", "character"))
R> res
    col1 col2
 1    1    T 
 2    2    T 
 3    3    T 
R> sapply(res, class)
        col1        col2  
   "numeric" "character"  
R>

你的帖子格式有些奇怪,所以我起初并没有看到你确实指的是colClasses。尽管回收规则我总是建议提供矢量 与列数一样多的条目。