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

时间:2012-02-28 10:41:29

标签: r integer dataframe text-files r-factor

我有以下代码

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 $得分是一个因素,我必须使它成为一个整数

如果我读得正确,as.numeric可以解决我的问题

我正在阅读as.numeric函数,但我无法理解我如何使用它

因此,请你给我一些建议吗?

提前谢谢

最好的问候 安娜

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 个答案:

答案 0 :(得分:11)

使用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.character(x)之前需要先as.numeric()。额外调用在将其转换为数字之前对级别信息进行编码。要了解其重要性,请注意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

如果我们首先将因子强制转换为字符向量,然后转换为数字,我们保留原始信息而不是R的内部表示

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

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

答案 1 :(得分:4)

我知道这是一个较老的问题,但我遇到了同样的问题,可能会有所帮助:

在这种情况下,您的分数列似乎不应该成为因子列。这通常发生在read.table之后,当它是文本列时。根据您所在的国家/地区,可能是您使用“,”而不是“。”单独浮动。然后R认为这是一个字符列,并使其成为一个因素。在那种情况下,Gavins的回答是行不通的,因为R不会将“123,456”改为123.456。您可以在文本编辑器中轻松修复它,将“,”替换为“。”虽然。