转换因子以整数在数据帧转换因子以整数在数据帧(Convert factor to integer i

2019-05-12 04:05发布

我有以下代码

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

再次我有同样的问题......

Answer 1:

随着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()直接因素,并为第二个例子表明,该不保留原始信息。



Answer 2:

我知道这是一个老问题,但我只是有同样的问题,可能是它帮助:

在这种情况下,你的分数列好像它不应该成为一个因素列。 当它是一个文本列,通常函数read.table后发生。 根据哪个国家你是从,可能是你有独立浮动的“”而不是一个“”。 那么R认为是一个字符列,使得它的一个因素。 在那种情况下Gavins答案是行不通的,因为R将不会使“123456”,以123.456。 您可以轻松地修复与替代文本编辑器“”用“” 虽然。



文章来源: Convert factor to integer in a data frame