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)
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我们可以忽略文本任何部分中出现的确切字符。