【问题标题】:Convert factor to integer in a data frame在数据框中将因子转换为整数
【发布时间】:2012-02-28 10:41:29
【问题描述】:

我有以下代码

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 函数,但我不明白如何使用它

所以你能给我一些建议吗?

提前谢谢你

最好的问候 安娜

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

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

【问题讨论】:

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


    【解决方案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() 直接应用于因子相同,并且正如第二个示例所示,这不会保留原始信息。

    【讨论】:

    • @Anna 您编辑的问题与以前几乎相同。我的答案包括使用as.numeric()。还有一个问题,我会相应地编辑我的答案。
    • 非常感谢.....如何使用 as numeric 直接转换 anna.total$score?以下是正确的吗? new.score
    • 取决于 - 请参阅我编辑的答案。我没有score 或您的原始数据。很大程度上取决于文本文件的外观等以及您如何阅读它。
    • 是否可以从这里向您发送我的文件的一部分以查看它的外观?
    • @Anna 编辑您的问题并包含来自dput(head(ann.total, n = 10)) 的输出。然后,我们可以使用它在我们的 R 会话中准确加载您拥有的内容(嗯,10 行)。
    【解决方案2】:

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

    在这种情况下,您的分数列似乎不应该成为一个因素列。当它是一个文本列时,这通常发生在 read.table 之后。根据您来自哪个国家/地区,您可能会使用“,”而不是“。”来分隔浮点数。然后 R 认为这是一个字符列并将其作为一个因素。并且在这种情况下,加文斯的回答将不起作用,因为 R 不会将 "123,456" 变为 123.456 。您可以在文本编辑器中轻松修复该问题,将“,”替换为“。”不过。

    【讨论】:

    • 或者用dec = ","读取数据,这就是那个参数的用途。
    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    相关资源
    最近更新 更多