麻烦强制数据框看起来像包“DOSE”中的对象;我的as.numeric()对象看起来不同

时间:2017-12-15 13:28:54

标签: r dplyr coercion

我在尝试将数据框强制转换为R package DOSE提供的数据方面遇到了一些麻烦,因此我可以从包GO over-representation test

运行clusterProfiler

clusterProfiler插图使用DOSE包中的geneList;它的类是数字,但它以某种方式将基因表达计数与基因id相关联。

您可以通过执行以下操作来查看数据:

source("https://bioconductor.org/biocLite.R")
biocLite("DOSE")
data(geneList, package="DOSE")
class(geneList)
[1] "numeric"

dput(head(geneList))
structure(c(4.57261268231107, 4.51459371540294, 4.41821798112707, 
4.14407518193211, 3.87625800905113, 3.67785700608222), .Names = c("4312", 
"8318", "10874", "55143", "55388", "991"))

我有一个包含两列的data.frame:

dput(df)
structure(list(Gene_symbol = c(5339L, 1778L, 79026L, 5591L, 23224L, 
23195L), HAP1_pc = c(170, 253, 221.5, 231, 163.5, 172)), .Names = c("Gene_symbol", 
"HAP1_pc"), class = "data.frame", row.names = c(NA, -6L))

当我尝试将此数据框强制转换为数字类时,它会给我一个错误:

df2 <- as.numeric(df)
Error: (list) object cannot be coerced to type 'double'

我搜索了Stack Overflow这个错误,并从this here找到了一个建议:

as.numeric(df[[1]])
[1]  5339  1778 79026  5591 23224 23195

当然这只返回第一列(基因ID)。

由于原因,如果我用2替换它应该返回第2列(基因表达)

as.numeric(df[[2]])
[1] 170.0 253.0 221.5 231.0 163.5 172.0

确实如此。

让我感到困惑的是,当我尝试指定一个范围时,它会返回第一列的第二行:

as.numeric(df[[1:2]])
[1] 1778

在这篇文章的底部,有人说上述解决方案仅适用于一列(似乎是这种情况);但是,他们对多列(下面)的建议不起作用,因为它返回类matrix

apply(df, 2 , as.numeric)
     Gene_symbol HAP1_pc
[1,]        5339   170.0
[2,]        1778   253.0
[3,]       79026   221.5
[4,]        5591   231.0
[5,]       23224   163.5
[6,]       23195   172.0

我尝试将此矩阵转换为数字,但这也不起作用。

foo <- apply(df, 2 , as.numeric)
bar <- as.numeric(foo)
bar
[1]  5339.0  1778.0 79026.0  5591.0 23224.0 23195.0   170.0   253.0   221.5   231.0   163.5   172.0

比较geneList和我的数据的输出,第一个明显的区别是我的list,所以我在unlist()之前尝试as.numeric()

as.numeric(unlist(df))
 [1]  5339.0  1778.0 79026.0  5591.0 23224.0 23195.0   170.0   253.0   221.5   231.0   163.5   172.0

与将矩阵转换为上面的数字相同的结果。

两个dput()的下一个显而易见的事情是,虽然我的数据有.Name作为标题,但是geneList .Name对于第1列中的每个值都是一个。这很可能是问题在于;但是,我不知道该怎么办。

如何用base R或使用`dplyr'来做到这一点?非常感谢您的帮助。

0 个答案:

没有答案