2

所以,我试图找出一个更大的问题,我认为这可能源于我从.txt文件中导入数据时发生的事情。我的常规开始命令是:

data<-read.table("mydata.txt",header=T)
attach(data)

因此,如果我的数据说 3 列带有 headers和"Var1",那么所有内容到底是如何导入的?似乎它是作为 3 个单独的向量导入的,然后绑定在一起,类似于使用."Var2""Var3"cbind()

我更大的问题是修改数据。如果我的数据框中的一行有一个空点(在任何列中),我需要将其删除:

data <- data[complete.cases(data),]

完美 - 现在假设原始数据框有 100 行,其中 5 行有一个空槽。我的新数据框应该有 95 行,对吧?好吧,如果我尝试:

> length(Var1)
[1] 100
> length(data$Var1)
[1] 95

所以看起来标记的原始列Var1不受我重写整个数据框的行的影响。这就是为什么我相信当我导入数据时,我实际上只有 3 个单独的列存储在名为Var1,Var2Var3. 至于让 R 认识到我想要修改版的专栏,我认为我需要按照以下方式做一些事情:

Var1 <- data$Var1 #Repeat for every variable

我的问题是我需要为每个变量编写上面的代码。我拥有的数据框很大,这种编码方式看起来很乏味。有没有更好的方法来转换我的数据,然后能够调用修改后的变量,而无需每次都使用 data$ 前体?

4

2 回答 2

7

read.table()将数据读入数据框中,文本文件中的每一列(变量)都有一个组件(列)。R 的数据框就像 Excel 电子表格,工作表中的每一列都可以包含不同类型的数据(与矩阵相反,矩阵在 R 中只能包含单一类型的数据)。

实际上,结果就好像数据是逐列读取的,然后使用该cbind.data.frame()方法逐列绑定在一起。这不是它在实践中的做法。您有一个data包含三个组件的对象,它们都不能通过键入它们的名称来访问(例如Var1)。试试这个_

data <- read.table("mydata.txt", header = TRUE)
Var1

在一个干净的会话中(最好如果你开始一个新的会话来尝试这个,以防万一)。

如果您要键入ls(),您只会看到data列出的内容(假设一个干净的会话)。这清楚地证明您认为您拥有三列和单个对象的想法。

这里真正的问题attach()不是read.table()

很少有好的用途,attach()你展示的不在其中。在搜索路径上放置attach(data)一个副本。data关键点是副本。搜索路径上的内容与data全局环境(您的工作区)中的内容不同。全局环境中的任何更改data都不会反映在搜索路径上的副本中,因为它们是两个完全独立的对象。

R 有一个搜索路径,用于查找命名对象。通常 R 不会查看对象内部,因此Var1无论何时在提示符下键入对象名称或尝试直接使用对象时都不会找到 etc。当您attach()是一个对象时,您可以将其视为打开对象以供 R 的搜索。但是让人们注意到的是,人们现在正在查看对象的副本而不是对象本身。

在交互式会话中,有一些有用的帮助函数,这意味着您不需要一直打字data$。例如,参见?with, 。?within?transform

真的不要用attach()它来代替打字。

于 2013-07-22T04:19:10.307 回答
3

我很确定 R 会逐行读取文件。(事实上​​,我认为几乎所有编程语言都以这种方式工作。)我想知道您是否在删除不完整的案例之前附加了数据框。当人们attach(data)事先打电话时,您描述的行为是相当典型的。一般来说,建议你attach()在R中完全不要使用。但如果必须使用,detach(data) 请先调用,然后修改数据框,然后(如果必须attach(data)再次调用。到那时,您将不再有这个问题。

请注意,您的问题也可能有所不同。但是,根据迄今为止提供的信息,我们无法判断。您将希望提供一个可重现的示例,以便人们可以更有效地帮助您,请参见此处:how-to-make-a-great-r-reproducible-example

于 2013-07-22T02:47:29.623 回答