我编写了一个脚本,可以处理一组基因表达数据。我将尝试将我的帖子放在简短的问题和相当冗长的解释中(对那个长文本块感到抱歉)。我希望这个简短的问题本身是有意义的。冗长的解释只是为了澄清我是否在简短的问题中没有理解重点。
我试图获得基本的 R 技能,但发生了一些令我困惑的事情,但我没有通过 google 找到任何启示。我真的不明白这个。我希望通过澄清这里发生的事情,我可以更好地理解 R。也就是说,我不是程序员,所以请忍受我的糟糕代码。
小问题:
当我有 rownames(foo) 例如
> print(rownames(foo))
"a" "b" "c" "d"
我尝试通过 print(rownames(foo[bar]) 访问它,它将它打印为 null。例如
> print(rownames(foo[2]))
NULL
在第二个答案中, Richie Cotton 将其解释为“[...] 没有任何名称,[...]”这向我表明,任一 rownames(foo) 为空 - 这显然不是我可以用“print(rownames(foo))”打印它的情况 - 或者这种访问方法失败。
但是,当我尝试更改位置栏的值时,我收到一条警告消息,即替换长度不匹配。然而,操作仍然成功——这几乎证明了这种访问方法确实是成功的。例如
> bar = 2
> rownames(foo[bar]) = some.vector(rab)
> print(rownames(foo[bar])
NULL
> print(rownames(foo))
"a" "something else" "c" "d"
为什么这行得通?显然,该函数无法正确访问 foo 中 bar 的位置,因为它将其打印为空。为什么它仍然成功地替换了该值并且没有以可怕的方式失败?或者反过来问:当它成功替换这个位置的值时,为什么打印函数没有正确返回值?
长背景说明:
数据源包含列表中的数字,基因的entrez-id,官方基因符号,affimetrix探针id,然后是增加或减少的值。它看起来像这样:
No Entrez Symbol Probe_id Sample1_FoldChange Sample2_FoldChange
1 690244 Sumo2 1367452_at 1.02 0.19
稍后在显示数据时,我希望它只打印出基因符号和增加值。现在,如果数据集中没有基因符号,它被打印为“n/a”,这对我来说显然没有价值,因为我无法确定它是众多基因中的哪一个。所以我做了第一个处理步骤,仅在这种情况下将“n/a”结果与“n/a(12345) 交换,其中 12345 是 entrez-id。
我编写了以下脚本来执行此操作。(请注意,因为我不是程序员,而且我是 RI 的新手,我怀疑它是否是漂亮的代码。但这不是我想讨论的重点。)
no.symbol.idx <-which(rownames(expr.table) == "n/a")
c1 <- character (length(rownames(expr.table)))
c2 <- c1
for (x in 1:length(c1))
{
c1[x] <- "n/a ("
}
for (x in 1:length(c2))
{
c2[x] <- ")"
}
rownames(expr.table)[no.symbol.idx] <- paste(c1, (expr.table[no.symbol.idx , "Entrez"]),c2, sep="")
该脚本有效并且它做了它应该做的事情。但是我收到以下错误消息。
Warning message:
In rownames(expr.table)[no.symbol.idx] <- paste(c1, (expr.table[no.symbol.idx, :
number of items to replace is not a multiple of replacement length
为了找出这里发生的事情,我将一些文本输出放入脚本中。
no.symbol.idx <-which(rownames(expr.table) == "n/a")
c1 <- character (length(rownames(expr.table)))
c2 <- c1
for (x in 1:length(c1))
{
c1[x] <- "n/a ("
}
for (x in 1:length(c2))
{
c2[x] <- ")"
}
print("print(rownames(expr.table)):")
print(rownames(expr.table))
print("print(no.symbol.idx):")
print(no.symbol.idx)
print("print(rownames(expr.table[no.symbol.idx])):")
print(rownames(expr.table[no.symbol.idx]))
print("print(rownames(expr.table[14])):")
print(rownames(expr.table[14]))
print("print(rownames(expr.table[15])):")
print(rownames(expr.table[15]))
cat("print(expr.table[no.symbol.idx,\"Entrez\"]):\n")
print(expr.table[no.symbol.idx,"Entrez"])
rownames(expr.table)[no.symbol.idx] <- paste(c1, (expr.table[no.symbol.idx , "Entrez"]),c2, sep="")
print("print(rownames(expr.table)):")
print(rownames(expr.table))
print("print(rownames(expr.table[no.symbol.idx])):")
print(rownames(expr.table[no.symbol.idx]))
我在控制台中得到以下输出。
[1] "print(rownames(expr.table)):"
[1] "Sumo2" "Cdc37" "Copb2" "Vcp" "Ube2d3" "Becn1" "Lypla2" "Arf1" "Gdi2" "Copb1" "Capns1" "Phb2" "Puf60" "Dad1" "n/a"
[1] "print(no.symbol.idx):"
[1] 15
[1] "print(rownames(expr.table[no.symbol.idx])):"
NULL
[1] "print(rownames(expr.table[14])):"
NULL
[1] "print(rownames(expr.table[15])):"
NULL
...(待续)所以显然 no.symbol.idx 获得了 n/a 值的正确位置。但是,当我尝试打印它时,它声称该位置的行名为空并返回 NULL。当我尝试“手动”访问此位置并使用 expr.table[15] 时,它也返回 NULL。然而,这与 n/a 值无关,因为存储在位置 14 的值也是如此。
... (the continuation)
print(expr.table[no.symbol.idx,"Entrez"]):
[1] "116727"
[1] "print(rownames(expr.table)):"
[1] "Sumo2" "Cdc37" "Copb2" "Vcp" "Ube2d3" "Becn1" "Lypla2" "Arf1" "Gdi2"
[10] "Copb1" "Capns1" "Phb2" "Puf60" "Dad1" "n/a (116727)"
[1] "print(rownames(expr.table[no.symbol.idx])):"
NULL
这是令我惊讶的结果。尽管如此,它仍在工作。它声称一切都将为NULL,但操作成功。我不明白这一点。
编辑: 这是您希望我运行的功能的结果。
str(expr.table)
chr [1:15, 1:17] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "401" "690244" "114562" "60384" ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:15] "Sumo2" "Cdc37" "Copb2" "Vcp" ...
..$ : chr [1:17] "No" "Entrez" "Symbol" "Probe_id" ...
head(expr.table)
dput(head(expr.table,10))
structure(c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"690244", "114562", "60384", "116643", "81920", "114558", "83510",
"64310", "29662", "114023", "Sumo2", "Cdc37", "Copb2", "Vcp",
"Ube2d3", "Becn1", "Lypla2", "Arf1", "Gdi2", "Copb1", "1367452_at",
"1367453_at", "1367454_at", "1367455_at", "1367456_at", "1367457_at",
"1367458_at", "1367459_at", "1367460_at", "1367461_at", "1.02000",
"-1.04000", "1.03000", "-0.12000", "-0.02000", "-0.03000", "0.09000",
"0.05000", "-0.09000", "0.16000", "0.19000", "0.11000", "-0.00425",
"0.52000", "0.46000", "0.42000", "0.20000", "0.05000", "0.21000",
"0.37000", "0.26000", "0.19000", "-0.03000", "0.35000", "0.34000",
"0.07000", "0.00156", "0.12000", "0.08000", "0.16000", "0.59000",
"0.20000", "-0.16000", "0.28000", "0.46000", "-0.15000", "0.00168",
"0.23000", "-0.01000", "0.10000", "0.05000", "0.12000", "-0.00522",
"0.58000", "0.23000", "0.06000", "0.01000", "0.07000", "-0.11000",
"0.23000", "-0.03", "0.08", "0.09", "0.08", "0.11", "0.03", "-0.08",
"0.02", "-0.05", "0.06", "0.03000", "-0.06000", "0.09000", "0.00940",
"0.11000", "-0.09000", "0.04000", "-0.04000", "-0.09000", "0.01000",
"0.04000", "-0.02000", "0.21000", "0.27000", "0.08000", "0.12000",
"0.06000", "0.26000", "0.04000", "0.40000", "0.05000", "0.05000",
"0.00897", "0.09000", "0.20000", "0.09000", "0.13000", "-0.03000",
"-0.08000", "-0.01000", "0.050000", "0.020000", "0.050000", "-0.005390",
"0.020000", "0.008080", "0.060000", "-0.030000", "-0.020000",
"-0.000406", "0.50", "0.11", "0.06", "0.19", "0.21", "0.32",
"0.15", "0.17", "0.14", "0.03", "-0.08000", "-0.11000", "-0.07000",
"0.03000", "-0.04000", "0.02000", "-0.00444", "-0.07000", "-0.13000",
"-0.11000", "0.25000", "0.15000", "0.22000", "0.74000", "0.39000",
"0.36000", "-0.08000", "0.18000", "0.00865", "0.43000"), .Dim = c(10L,
17L), .Dimnames = list(c("Sumo2", "Cdc37", "Copb2", "Vcp", "Ube2d3",
"Becn1", "Lypla2", "Arf1", "Gdi2", "Copb1"), c("No", "Entrez",
"Symbol", "Probe_id", "AA_HD_24h_FoldChange", "AAF_HD_24h_FoldChange",
"APAP_HD_24h_FoldChange", "BBZ_HD_24h_FoldChange", "BCT_HD_24h_FoldChange",
"BEA_HD_24h_FoldChange", "CBP_HD_24h_FoldChange", "CCL4_HD_24h_FoldChange",
"CPA_HD_24h_FoldChange", "CSP_HD_24h_FoldChange", "DEN_HD_24h_FoldChange",
"LS_HD_24h_FoldChange", "PCT_HD_24h_FoldChange")))
在这里我添加了我用于调试的文件。这是它读入 expr.table 的数据。
No Entrez Symbol Probe_id AA_HD_24h_FoldChange AAF_HD_24h_FoldChange APAP_HD_24h_FoldChange BBZ_HD_24h_FoldChange BCT_HD_24h_FoldChange BEA_HD_24h_FoldChange CBP_HD_24h_FoldChange CCL4_HD_24h_FoldChange CPA_HD_24h_FoldChange CSP_HD_24h_FoldChange DEN_HD_24h_FoldChange LS_HD_24h_FoldChange PCT_HD_24h_FoldChange
1 690244 Sumo2 1367452_at 1.02 0.19 0.26 0.59 0.05 -0.03 0.03 0.04 0.05 0.05 0.5 -0.08 0.25
2 114562 Cdc37 1367453_at -1.04 0.11 0.19 0.2 0.12 0.08 -0.06 -0.02 0.05 0.02 0.11 -0.11 0.15
3 60384 Copb2 1367454_at 1.03 -4.25E-003 -0.03 -0.16 -5.22E-003 0.09 0.09 0.21 8.97E-003 0.05 0.06 -0.07 0.22
4 116643 Vcp 1367455_at -0.12 0.52 0.35 0.28 0.58 0.08 9.40E-003 0.27 0.09 -5.39E-003 0.19 0.03 0.74
5 81920 Ube2d3 1367456_at -0.02 0.46 0.34 0.46 0.23 0.11 0.11 0.08 0.2 0.02 0.21 -0.04 0.39
6 114558 Becn1 1367457_at -0.03 0.42 0.07 -0.15 0.06 0.03 -0.09 0.12 0.09 8.08E-003 0.32 0.02 0.36
7 83510 Lypla2 1367458_at 0.09 0.2 1.56E-003 1.68E-003 0.01 -0.08 0.04 0.06 0.13 0.06 0.15 -4.44E-003 -0.08
8 64310 Arf1 1367459_at 0.05 0.05 0.12 0.23 0.07 0.02 -0.04 0.26 -0.03 -0.03 0.17 -0.07 0.18
9 29662 Gdi2 1367460_at -0.09 0.21 0.08 -0.01 -0.11 -0.05 -0.09 0.04 -0.08 -0.02 0.14 -0.13 8.65E-003
10 114023 Copb1 1367461_at 0.16 0.37 0.16 0.1 0.23 0.06 0.01 0.4 -0.01 -4.06E-004 0.03 -0.11 0.43
11 29156 Capns1 1367462_at -0.23 0.32 0.11 0.13 -0.38 -0.15 -0.08 0.15 -0.18 0.2 0.13 -0.18 0.09
12 114766 Phb2 1367463_at 1.01E-003 0.29 0.41 0.59 0.05 -0.07 -0.13 -0.18 -0.28 -0.21 -0.22 -0.2 0.39
13 84401 Puf60 1367464_at -0.05 0.33 0.14 0.3 0.03 0.02 8.96E-003 2.96E-003 -8.63E-003 -0.13 0.07 -0.15 0.44
14 192275 Dad1 1367465_at 0.22 -0.21 -0.19 -0.24 -0.47 -0.01 -0.09 0.68 -0.06 -0.08 0.02 -0.29 -0.25
401 116727 n/a 1367852_s_at -0.34 -0.12 -0.06 -0.11 0.13 0.03 0.07 -0.18 0.08 -0.2 0.04 -0.04 0.06
Rownames 填充有 Gene 符号,例如 Sumo2 表示 No 1。脚本应该做(并且做)的是条目 No 401,它应该将名称从 n/a 更改为 n/a(116727)。但是,发生了上述警告,我想了解这里发生了什么。