在数据框中将因子转换为整数

4
我有以下代码。
anna.table<-data.frame (anna1,anna2)
write.table<-(anna.table, file="anna.file.txt",sep='\t', quote=FALSE) 

我的表格最终包含以下数字:

chr         start    end      score
chr2      41237927  41238801    151
chr1      36976262  36977889    226
chr8      83023623  83025129    185

之后,我尝试获取符合特定条件的值,例如分数低于特定值

因此,我正在执行以下操作:

anna3<-"data/anna/anna.file.txt"
anna.total<-read.table(anna3,header=TRUE)
significant.anna<-subset(anna.total,score <=0.001)

Error: In Ops.factor(score, 0.001) <= not meaningful for factors

我猜问题出在我的表格中有因子而不是整数。
我猜我的anna.total$score是因子,我必须将其转换为整数。
如果我理解正确,as.numeric可能可以解决我的问题。
我正在阅读有关as.numeric函数的内容,但我无法理解如何使用它。
因此,您能否给我一些建议?
提前感谢您。
最好的问候, Anna
PS: 我尝试了以下方法:
anna3<-"data/anna/anna.file.txt"
anna.total<-read.table(anna3,header=TRUE)
anna.total$score.new<-as.numeric (as.character(anna.total$score))
write.table(anna.total,file="peak.list.numeric.v3.txt",append = FALSE ,quote = FALSE,col.names =TRUE,row.names=FALSE, sep="\t")

anna.peaks<-subset(anna.total,fdr.new <=0.001)
Warning messages:
1: In Ops.factor(score, 0.001) : <= not meaningful for factors

我又遇到了同样的问题……

2个回答

12

使用 anna.table(顺便说一下,它是一个数据框,而不是表格!)的最简单方法就是直接执行:

anna.table2 <- data.matrix(anna.table)

data.matrix()将因子转换为它们底层的数值(整数)水平。这对于仅包含数字、整数、因子或可以强制转换为数字的其他变量的数据框架有效,但任何字符字符串(字符)都将导致矩阵变成字符矩阵。

如果您希望anna.table2成为数据框架而不是矩阵,则可以随后执行:

anna.table2 <- data.frame(anna.table2)

其他选项是将所有因子变量强制转换为它们的整数级别。以下是一个示例:

## dummy data
set.seed(1)
dat <- data.frame(a = factor(sample(letters[1:3], 10, replace = TRUE)), 
                  b = runif(10))

## sapply over `dat`, converting factor to numeric
dat2 <- sapply(dat, function(x) if(is.factor(x)) {
                                    as.numeric(x)
                                } else {
                                    x
                                })
dat2 <- data.frame(dat2) ## convert to a data frame

这将会得到:

> str(dat)
'data.frame':   10 obs. of  2 variables:
 $ a: Factor w/ 3 levels "a","b","c": 1 2 2 3 1 3 3 2 2 1
 $ b: num  0.206 0.177 0.687 0.384 0.77 ...
> str(dat2)
'data.frame':   10 obs. of  2 variables:
 $ a: num  1 2 2 3 1 3 3 2 2 1
 $ b: num  0.206 0.177 0.687 0.384 0.77 ...

需要注意的是,上述方法仅适用于想要获取基础数字表示的情况。如果您的因子具有基本数字级别,则在保留编码在级别中的"数字"信息的同时将因子转换为数字时,我们需要更加聪明一些。以下是一个例子:

## dummy data
set.seed(1)
dat3 <- data.frame(a = factor(sample(1:3, 10, replace = TRUE), levels = 3:1), 
                   b = runif(10))

## sapply over `dat3`, converting factor to numeric
dat4 <- sapply(dat3, function(x) if(is.factor(x)) {
                                    as.numeric(as.character(x))
                                } else {
                                    x
                                })
dat4 <- data.frame(dat4) ## convert to a data frame
请注意,在进行as.numeric()之前,我们需要先执行as.character(x)。这个额外的调用在将其转换为数字之前对级别信息进行编码。要了解为什么这很重要,请注意dat3$a是什么。
> dat3$a
 [1] 1 2 2 3 1 3 3 2 2 1
Levels: 3 2 1
如果我们仅将其转换为数字,那么我们得到的数据是错误的,因为R会转换底层级别代码。
> as.numeric(dat3$a)
 [1] 3 2 2 1 3 1 1 2 2 3

如果我们先将因子(factor)强制转换为字符向量,然后再转换为数值向量,就可以保留原始信息而不是 R 的内部表示。

> as.numeric(as.character(dat3$a))
 [1] 1 2 2 3 1 3 3 2 2 1

如果你的数据像第二个例子一样,那么你不能使用简单的 data.matrix() 技巧,因为这与将 as.numeric() 直接应用于因子是相同的,而正如第二个例子所示,这并不能保留原始信息。


@Anna,你修改后的问题和之前几乎一样。我的答案包括使用 as.numeric()。还有一个需要注意的地方,我会相应地编辑我的答案。 - Gavin Simpson
非常感谢您。我该如何使用as.numeric直接转换anna.total$score?以下是否正确?new.score<-as.numeric(anna.total$score)? - Anna
取决于 - 请参考我的编辑答案。我没有 score 或者你的原始数据。很多事情都取决于文本文件的格式以及你如何读取它。 - Gavin Simpson
从这里是否可以发送给您我的文件的一部分,以查看其外观? - Anna
@Anna编辑您的问题,并包含来自 dput(head(ann.total, n = 10)) 的输出。然后,我们可以在我们的R会话中使用这个来准确加载您拥有的内容(好的,10行价值)。 - Gavin Simpson

4
我知道这是一个较旧的问题,但我最近遇到了同样的问题,也许这可以帮助您:
在这种情况下,您的得分列似乎不应该变成因子列。通常在read.table之后,当它是文本列时才会发生这种情况。根据您来自哪个国家,可能使用“,”而不是“.”分隔浮点数。然后R认为它是一个字符列并将其变成因子。在这种情况下,Gavins的答案行不通,因为R不会将“123,456”更改为123.456。您可以在文本编辑器中使用替换“,”为“。”轻松解决这个问题。

1
或者使用 dec = "," 读取数据,这就是该参数的作用。 - Gavin Simpson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接