让我们从内到外剖析你的电话在做什么。
基本索引
当索引data.frame 或matrix(假设为二维)时,您可以使用方括号符号访问其中的单个元素,如您所见。例如,要查看第四行第五列中的值,您可以使用vData[4,5]。这也适用于行和/或列的范围,例如 vData[1:4,5] 将前 4 行和第 5 列作为向量返回。
注意:1:4 范围也可以是任意数字向量,例如返回 3 x 2 矩阵的vData[c(1,2,5),c(4,8)]。
顺便说一句: 默认情况下,当生成的切片/子矩阵的其中一个维度减少到 1 时(如后一个示例所示),R 会将其放到较低的结构(例如,matrix -> vector -> scalar)。在这种情况下,它会将vData[1:4,5] 放到一个向量中。您可以通过在方括号中添加看似第三维的内容来防止这种情况发生:vData[1:4,5,drop=FALSE],意思是“不要删除简化的维度”。现在,您应该得到一个 4 行 1 列的矩阵作为回报。
您可以通过阅读(例如)一些"Hadleyverse" 来阅读有关如何对 data.frames 进行子集化的更全面的说明。如果您这样做,我强烈建议您将其设为交互式会话:在阅读时播放 R,以帮助巩固方法。
负索引
负索引表示“所有除了列出的内容”。在您的示例中,您正在对数据进行子集化以提取所有 列 1:8 的内容。因此,您的 vData[,-c(1:8)] 返回所有行和列 9 到 20,即 20K x 12 矩阵。不小。
换位
您可能已经知道t() 的作用:转置矩阵,使其现在为 12 x 20K。
警告:如果您的所有 data.frame 列都属于同一类(例如,“字符”、“逻辑”),那么一切都很好。但是,data.frames 允许在不同列中使用不同类型的数据这一事实并不是矩阵共享的特征。如果一个 data.frame 列与其他列不同,它们将被转换为最高通用格式,例如,logical < integer < numeric < character。
返回data.frame
转置后(转换为matrix),您转换回data.frame,这可能需要也可能不需要,具体取决于稍后打算如何处理数据。例如,如果行名没有意义,那么转换为 data.frame 可能就没那么有用了。这相对无关紧要,但我喜欢不要过度转换事物。我也喜欢使用更简单的数据结构,而且矩阵通常比 data.frames 更快。
头
... 只为您提供 data.frame 或矩阵的顶部 n rows。在您的情况下,由于您转置了它,它现在是 20K 列宽,这在命令行上可能有点笨拙。
替代方案
根据我之前提供的内容,您可能只想查看前几行和前几列? dataExpr0[1:5,1:5] 会起作用,head(dataExpr0[,1:5], n=5) 也会起作用。
还有其他问题吗?
我强烈建议您阅读更多 Hadleyverse 并更加熟悉子集和基本数据管理。这是使用 R 的基础,而 StackOverflow 并不总是有足够的耐心来回答这样的基线问题。这个论坛最适合那些已经做了一些研究,阅读文档和帮助页面,并尝试了一些代码,然后才弄清楚为什么它不起作用的人。您提供的一些基本代码很好,但 SO 并不适合教授如何从 R 开始。