刷新函数对 R 中的 read.table 有什么作用?

Lev*_*evy 5 r scanning read.table

我最近开始参加 R 课程,目前正在研究扫描文件。在工作表上,我的一个问题是:

读取文件Table6.txt,先查看文件。注意信息是重复的,我们只想要第一个非重复的。这次确保只创建角色而不是因素。最后,我们不想要评论。

该文件名为Table6.Txt

我设法编写了正确读取表格的代码,但是答卷在扫描功能中有一个额外的部分,上面写着 flush=TRUE

我的代码是这样的:

df <- read.table("Table6.txt",skip = 1,header = TRUE,row.names = "Name",nrow
= 7,comment.char = "@",stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

并且答卷显示

df <- read.table("Table6.txt",skip = 1,header = TRUE,row.names = "Name",nrow
= 7,flush = TRUE,comment.char = "@",stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

冲洗功能在这里做什么?两个代码的输出给出相同的数据帧。

df <- read.table("Table6.txt",skip = 1,header = TRUE,row.names = "Name",nrow
                  = 7,flush = TRUE,comment.char = "@",stringsAsFactors = FALSE)
 df
         Age Height Weight Sex
Alex      25    177     57   F
Lilly     31    163     69   F
Mark      23    190     83   M
Oliver    52    179     75   M
Martha    76    163     70   F
Lucas     49    183     83   M
Caroline  26    164     53   F
 df <- read.table("Table6.txt",skip = 1,header = TRUE,row.names = "Name",nrow
                  = 7,comment.char = "@",stringsAsFactors = FALSE)
 df
         Age Height Weight Sex
Alex      25    177     57   F
Lilly     31    163     69   F
Mark      23    190     83   M
Oliver    52    179     75   M
Martha    76    163     70   F
Lucas     49    183     83   M
Caroline  26    164     53   F
Run Code Online (Sandbox Code Playgroud)

Ron*_*hah 1

read.table我阅读了和的文档,scan这就是我用简单的话理解的内容。flush尝试通过忽略额外的字符(如果有)来使数据帧完整。

例如,让我们采用您共享的相同数据

read.table(text = 'Age Height Weight Sex
          Alex      25    177     57   F
          Lilly     31    163     69   F
          Mark      23    190     83   M
          Oliver    52    179     75   M
          Martha    76    163     70   F
          Lucas     49    183     83   M
          Caroline  26    164     53   F', header = TRUE)
Run Code Online (Sandbox Code Playgroud)

这按预期工作并返回

#         Age Height Weight Sex
#Alex      25    177     57   F
#Lilly     31    163     69   F
#Mark      23    190     83   M
#Oliver    52    179     75   M
#Martha    76    163     70   F
#Lucas     49    183     83   M
#Caroline  26    164     53   F
Run Code Online (Sandbox Code Playgroud)

现在让我们在末尾添加一个额外的字符。

read.table(text = "Age Height Weight Sex
          Alex      25    177     57   F
          Lilly     31    163     69   F
          Mark      23    190     83   M
          Oliver    52    179     75   M
          Martha    76    163     70   F
          Lucas     49    183     83   M
          Caroline  26    164     53   F A", header = TRUE)
                                         ^ #Notice this A
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误

扫描错误(文件=文件,什么=什么,sep = sep,quote = quote,dec = dec,:第7行没有5个元素

这是有道理的,因为最后一行中有一个附加字符。

我们可以添加fill = TRUE

read.table(text = "Age Height Weight Sex
          Alex      25    177     57   F
          Lilly     31    163     69   F
          Mark      23    190     83   M
          Oliver    52    179     75   M
          Martha    76    163     70   F
          Lucas     49    183     83   M
          Caroline  26    164     53   F A", header = TRUE, fill = TRUE)

#         Age Height Weight Sex
#Alex      25    177     57   F
#Lilly     31    163     69   F
#Mark      23    190     83   M
#Oliver    52    179     75   M
#Martha    76    163     70   F
#Lucas     49    183     83   M
#Caroline  26    164     53   F
#A         NA     NA     NA    
Run Code Online (Sandbox Code Playgroud)

NA这会根据列的类型填充 's 或空字符,从而在末尾添加额外的行。

现在如果我们添加flush = TRUE

read.table(text = "Age Height Weight Sex
          Alex      25    177     57   F
          Lilly     31    163     69   F
          Mark      23    190     83   M
          Oliver    52    179     75   M
          Martha    76    163     70   F
          Lucas     49    183     83   M
          Caroline  26    164     53   F A", header = TRUE, flush = TRUE)

#         Age Height Weight Sex
#Alex      25    177     57   F
#Lilly     31    163     69   F
#Mark      23    190     83   M
#Oliver    52    179     75   M
#Martha    76    163     70   F
#Lucas     49    183     83   M
#Caroline  26    164     53   F
Run Code Online (Sandbox Code Playgroud)

"A"它忽略末尾的附加内容,将其视为注释并生成完整的数据框。


就您而言,这对最终输出没有任何影响,因为您的数据是完整的并且没有任何不完整的信息。如果您正在读取不了解其结构的数据,您可以将此视为要遵循的安全编程实践之一。

希望这能澄清一点。


comment.char正如@Christoph 所评论的,这里有一个例子来演示和之间的区别flush

read.table(text = 'Age Height Weight Sex
          Alex      25    177     57   F
          Lilly     31    163     69   F
          Mark      23    190     83   M
          Oliver    52    179     75   M
          Martha    76    163     70   F
        @ Lucas     49    183     83   M 
          Caroline  26    164     53   F @', header = TRUE,flush = TRUE)

#           Age Height Weight Sex
#Alex        25    177     57   F
#Lilly       31    163     69   F
#Mark        23    190     83   M
#Oliver      52    179     75   M
#Martha      76    163     70   F
#@        Lucas     49    183  83
#Caroline    26    164     53   F


read.table(text = 'Age Height Weight Sex
          Alex      25    177     57   F
          Lilly     31    163     69   F
          Mark      23    190     83   M
          Oliver    52    179     75   M
          Martha    76    163     70   F
        @ Lucas     49    183     83   M 
          Caroline  26    164     53   F @', header = TRUE,comment.char = '@')

#         Age Height Weight Sex
#Alex      25    177     57   F
#Lilly     31    163     69   F
#Mark      23    190     83   M
#Oliver    52    179     75   M
#Martha    76    163     70   F
#Caroline  26    164     53   F
Run Code Online (Sandbox Code Playgroud)

flush = TRUE @不忽略倒数第二行开头的存在,而是忽略最后一个字符 ( ) M。但是,comment.char我们可以忽略文本任何部分中出现的确切字符。