【问题标题】:How is my data stored in R?我的数据如何存储在 R 中?
【发布时间】:2026-01-16 15:00:02
【问题描述】:

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

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

因此,如果我的数据显示 3 列标题为 "Var1""Var2""Var3",那么所有内容究竟是如何导入的?看起来好像是作为 3 个单独的向量导入,然后绑定在一起,类似于使用 cbind()

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

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

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

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

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

Var1 <- data$Var1 #Repeat for every variable

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

【问题讨论】:

    标签: r


    【解决方案1】:

    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 等。当您attach() 一个对象时,您可以将其视为打开对象以供 R 的搜索。但是让人们注意到的是,人们现在正在查看对象的副本而不是对象本身。

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

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

    【讨论】:

    • +1,这是一个很好的解释方式。实际上,我只是在评论中使用了硬拷贝与.doc 文件的类比。
    【解决方案2】:

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

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

    【讨论】:

    • “不要使用attach()”只是总结一下。
    • 好的,我尝试删除我的 attach() 行,但问题仍然存在。我读过一篇关于不使用 attach() 而是使用 data=my.data 作为参数来避免使用 my.data$Var1 的好文章。当我在我的生物统计课程中学习 R 时,他们总是使用 attach(),所以现在我知道得更清楚了!关于制作可重现的代码 - 我确实尽了最大努力,但我无法弄清楚如何从头开始在 r 中生成数据框。我将在第二条评论中解释。
    • 我试过了:x&lt;-c(1,2,3) y&lt;-c(4,5,6) data&lt;-data.frame(x,y) 我可以调用 x 或 data$x。如果我remove(x) 我只能调用data$x(调用x 返回错误:找不到对象)。而如果我导入一些数据(比如我的原始帖子),我总是可以调用Var1(无需指定data$Var1)。我认为这是我不明白导入 .txt 时会发生什么的症状。
    • 感谢您的努力,@darcy.mulder。我知道课程经常教授@​​987654333@ 命令。它可能有用,但也很危险;它经常绊倒人们,这就是我认为发生在你身上的事情。至于删除您的 attach() 行,如果您已经运行它,那将无济于事。尝试使用我概述的detach() 等策略。
    • 我清除了我的工作区(使用 RStudio),运行了 detach() 代码,现在我不能简单地调用 Var1。所以现在我明白了attach() 的作用——它允许我调用附加数据框的列。所以如果我不附加我的数据,我不能直接调用Var1,但我需要指定data$Var1。我怀疑这就是我被教导使用attach()的原因。