将文本文件转换为数据帧R

将文本文件转换为数据帧R,r,bigdata,data-manipulation,R,Bigdata,Data Manipulation,我知道这里也有人问过类似的问题,但我仍然相信我的任务更复杂 我有一个文本文件,其中包含来自项目geonames.org名为MX.txt的信息,其中的数据排列如下: MX 20158 Villas del Cobano Aguascalientes AGU Aguascalientes 001 Aguascalientes 01 21.8495 -102.3052 1 MX 20158 Hacienda el Cobano Aguascalientes A

我知道这里也有人问过类似的问题,但我仍然相信我的任务更复杂

我有一个文本文件,其中包含来自项目geonames.org名为MX.txt的信息,其中的数据排列如下:

MX  20158   Villas del Cobano   Aguascalientes  AGU Aguascalientes  
001      Aguascalientes 01  21.8495 -102.3052   1
MX  20158   Hacienda el Cobano  Aguascalientes  AGU Aguascalientes  
001 Aguascalientes  01 21.8495  -102.3052   1
MX  20159   Alianza Ferrocarrilera  Aguascalientes  AGU Aguascalientes  
001 Aguascalientes  01  21.8495 -102.3052   1
MX  20159   Bosques del Prado Oriente   Aguascalientes  AGU Aguascalientes
001 Aguascalientes  01  21.8495 -102.3052   1
MX  20160   Francisco Guel Jimenez  Aguascalientes  AGU Aguascalientes  
001 Aguascalientes  01  21.7561 -102.305    1
MX  20160   Las Viñas INFONAVIT Aguascalientes  AGU Aguascalientes  
001 Aguascalientes  01  21.7561 -102.305    1
MX  20164   Santa Anita 4a Sección  Aguascalientes  AGU Aguascalientes  
001 Aguascalientes  01  21.7561 -102.305    1
V1  V2      V3                  V4              V5  V6
MX  20158   Villas del Cobano   Aguascalientes  AGU Aguascalientes  
V7  V8              V9  V10     V11         V12
001 Aguascalientes  01  21.8495 -102.3052   1
V1  V2      V3                  V4              V5  V6
MX  20158   Hacienda el Cobano  Aguascalientes  AGU Aguascalientes
V7  V8              V9  V10     V11         V12 
001 Aguascalientes  01 21.8495  -102.3052   1
这个文件有几千行

我想把它转换成一个包含12个变量的数据帧,其中字符串“Villas del Cobano”是这样的一个条目:

MX  20158   Villas del Cobano   Aguascalientes  AGU Aguascalientes  
001      Aguascalientes 01  21.8495 -102.3052   1
MX  20158   Hacienda el Cobano  Aguascalientes  AGU Aguascalientes  
001 Aguascalientes  01 21.8495  -102.3052   1
MX  20159   Alianza Ferrocarrilera  Aguascalientes  AGU Aguascalientes  
001 Aguascalientes  01  21.8495 -102.3052   1
MX  20159   Bosques del Prado Oriente   Aguascalientes  AGU Aguascalientes
001 Aguascalientes  01  21.8495 -102.3052   1
MX  20160   Francisco Guel Jimenez  Aguascalientes  AGU Aguascalientes  
001 Aguascalientes  01  21.7561 -102.305    1
MX  20160   Las Viñas INFONAVIT Aguascalientes  AGU Aguascalientes  
001 Aguascalientes  01  21.7561 -102.305    1
MX  20164   Santa Anita 4a Sección  Aguascalientes  AGU Aguascalientes  
001 Aguascalientes  01  21.7561 -102.305    1
V1  V2      V3                  V4              V5  V6
MX  20158   Villas del Cobano   Aguascalientes  AGU Aguascalientes  
V7  V8              V9  V10     V11         V12
001 Aguascalientes  01  21.8495 -102.3052   1
V1  V2      V3                  V4              V5  V6
MX  20158   Hacienda el Cobano  Aguascalientes  AGU Aguascalientes
V7  V8              V9  V10     V11         V12 
001 Aguascalientes  01 21.8495  -102.3052   1
我已经尝试过以前在这里发布的答案,如: ,

因为英语不是我的第一语言,如果我的问题不清楚,我想通过评论部分回答问题,而不是得到否定的标志


提前谢谢

列之间的分隔符是选项卡,然后使用

data <- read.table(file="MX.txt", sep="\t", quote="", comment.char="")

data我提出了一个冗长的解决方案,可能会得到你想要的。简而言之,我使用每个嵌套列表的起点和终点之间的已知距离来隔离“多部分名称”,将其连接起来,并将其作为列输入到其他数据中

函数splitAt来自

#支持功能

splitAt假设其余数据与此数据类似。我必须做很多清洁工作(例如,
gsub
ing):

守则:

vect <- unlist(Map(function(x, y) paste(x, y), dat[c(T, F)], dat[c(F, T)]), 
    use.names = FALSE)
read.table(text=gsub("\\s{2,}", ", ", gsub("(\\s)(\\d{2,})", "  \\2", 
    gsub("(\\d{2,}|[A-Z]+)\\s+", "\\1  ", vect))), sep=",")

vect这可能是个愚蠢的问题,但您是否尝试过使用
sep=“\t”
读取.table()
?你能展示一下你尝试过的代码和最终得到的结果吗?谢谢你的快速回复!不,事实上我没有,当我不小心删除了所有文件时,它似乎像我想要的那样工作,但第一行现在显示:“扫描错误(文件、内容、nmax、sep、dec、quote、skip、nlines、na.strings,:第67894行没有12个元素”刚刚编辑了这样一行,效果很好。你想把它作为一个答案写下来,这样我就可以把它标记为回答了吗?@LJW现在刚回到这个问题上-看起来你下面有一些很好的答案,所以我不会重复了。很高兴你的答案起作用了!很抱歉反馈太晚,第一个答案实际上解决了我的问题,但你的答案非常有趣/合乎逻辑。Yh谢谢你!