5

我发现了一个问题,即 R 似乎解释"T"TRUE即使在使用一切手段避免这样做时(至少根据这篇文章)。

示例数据(另存为“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是该基因中的位置。

在此先感谢您的帮助

4

1 回答 1

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. 尽管有回收规则,我总是建议提供一个包含与列一样多的条目的向量。

于 2013-10-28T20:20:13.397 回答