R rownames(foo [bar])打印为null但可以成功更改 - 为什么?

时间:2013-09-27 10:12:54

标签: r

我编写了一个可以处理set基因表达数据的脚本。 我将尝试在短问题和相当冗长的解释中分离我的帖子(抱歉这个长文本块)。我希望这个简短的问题本身是有道理的。长篇解释只是为了澄清我是否在短期问题中没​​有明白这一点。

我试图获得基本的R技能以及让我感到困惑的事情,而且我没有通过谷歌找到任何启​​发。我真的不明白这一点。我希望通过澄清这里发生的事情,我可以更好地理解R. 那就是说我不是程序员,所以请忍受我的错误代码。

简短问题:

当我有rownames(foo)时,例如

> print(rownames(foo))
"a"     "b"     "c"     "d" 

我尝试通过print(rownames(foo [bar])访问它,它将其打印为null。 E.g

> print(rownames(foo[2]))
NULL

Here in the second answer Richie Cotton将此解释为“[......]没有任何名字,[...]” 这将向我表明,rownames(foo)是空的 - 显然不是这种情况,因为我可以使用“print(rownames(foo))”打印它 - 或者这种访问方法失败。

但是,当我尝试更改位置栏上的值时,我收到一条警告消息,表示替换长度不匹配。然而,该操作仍然成功 - 这几乎证明了这种访问方法确实是成功的。 E.g。

> 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。

我编写了以下脚本来执行此操作。 (注意,因为我不是程序员而且我是R的新手,我怀疑它是非常漂亮的代码。但这不是我想讨论的重点。)

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值的正确位置。 当我尝试打印它时,它声称此位置的rownames为空并返回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。 脚本应该做什么(并且确实如此)对于条目号401它应该将名称从n / a更改为n / a(116727)。然而,发生了上述警告,我想了解这里发生了什么。

1 个答案:

答案 0 :(得分:1)

我假设您使用的是名为data.frame的{​​{1}}。在引擎盖下,foo是一个向量列表,每个向量的长度相同。

  • 因此data.framefoo[2]的第二列称为数据框,foofoo[,2]的第二列称为向量。 foo是一个向量,第二个术语是rownames(foo)

  • 如果您想要rownames(foo)[2]的第二列作为数据框,那么您可以使用foofoo[2],而foo[,2,drop=FALSE]会给您与print(rownames(foo[2]))相同的结果{1}}

  • 如果您希望将print(rownames(foo))的第二行作为数据框,那么您需要使用foo中的逗号,foo[2,]将获得与print(rownames(foo[2,]))相同的结果}

如果您想更改原始print(rownames(foo)[2])数据框中第foo行的第二行的名称,请尝试以下操作:

foo