Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 读取第一列也有空格的以空格分隔的文本文件_R_Text Files - Fatal编程技术网

R 读取第一列也有空格的以空格分隔的文本文件

R 读取第一列也有空格的以空格分隔的文本文件,r,text-files,R,Text Files,我正在尝试将文本文件读入R,如下所示: Ant farm 45 67 89 Cookie 5 43 21 Mouse hole 5 87 32 Ferret 3 56 87 等等 我的问题是文件是以空格分隔的,并且第一个变量的某些条目包含空格,因此读入R会由于不同的行具有更多的列而产生错误。有人知道怎么读懂这个吗 将数据集读入字符向量(我使用textConnection()来避免创建测试文件;您只需读取行(“your_file.txt”): 如果您的文件很大,最好在R之外使用命令行工具,如se

我正在尝试将文本文件读入R,如下所示:

Ant farm 45 67 89
Cookie 5 43 21
Mouse hole 5 87 32
Ferret 3 56 87
等等


我的问题是文件是以空格分隔的,并且第一个变量的某些条目包含空格,因此读入R会由于不同的行具有更多的列而产生错误。有人知道怎么读懂这个吗

将数据集读入
字符
向量(我使用
textConnection()
来避免创建测试文件;您只需
读取行(“your_file.txt”)


如果您的文件很大,最好在R之外使用命令行工具,如
sed

Ben的方法效果很好,但下面是另一种方法,使用来自的
`Straplyc
gsubfn
Straply

首先读取数据并设置
列名称
、分隔符和要使用的模式:

r <- readLines(textConnection(
 "Ant farm 45 67 89
Cookie 5 43 21
Mouse hole 5 87 32
Ferret 3 56 87"))

library(gsubfn)

col.names <- c("group", "x1", "x2", "x3")
sep <- ","  # if comma can appear in fields use something else
pat <- "^(.*) +(\\d+) +(\\d+) +(\\d+) *$"
3a)这一个涉及到一些额外的操作,因此我们可能会选择其他解决方案,但为了完整性,这里是。
combine=list
可防止单个输出被屏蔽,而
simplify=c
可删除添加的额外层。最后,我们把所有的东西都放在一起

tmp <- strapply(r, pat,
  ~ data.frame(
      group = group, 
      x1 = as.numeric(x1), 
      x2 = as.numeric(x2), 
      x3 = as.numeric(x3),
      stringsAsFactors = FALSE
    ), combine = list, simplify = c)
do.call(rbind, tmp)

注意:这些方法有几个优点(尽管Ben的方法也可以针对这些情况进行修改)。这种方法将最后3个数字之前的任何内容都用作第一个字段,因此,如果第一个字段有3个或更多的字,或者其中一个“字”是一组数字(例如“17英寸蚂蚁农场”),那么它仍然可以工作。

假设您在linux或osx上,并且要在中读取的文件称为test

read.table(pipe('perl -pe "s/(\\D+) (\\d+) (\\d+) (\\d+)/\\1\t\\2\t\\3\t\\4/" test'), sep='\t')
您还可以使用相同的方法创建一个更通用的函数来读取任何键入的输入

read_typed = function(file, types, sep=' ', ...){

  all_types = c('character' = '([\\w ]+)', 'integer' = '(\\d+)', 'numeric' = '([\\d.eE\\-+]+)', 'logical' = '([TF]|TRUE|FALSE)')
  command = paste0('perl -pe "s/', paste0(all_types[types], collapse=sep),
                   '/',
                   paste0('\\', seq_along(types), collapse='\t'),
                   '/" ', file)
  read.table(sep='\t', pipe(command), ...)
}
read_typed('test', c("character", 'integer', 'integer', 'integer'))

那么,如何识别列呢?它们是固定宽度的吗?或者字符列总是紧挨着整数列/在整数列之间,而从不紧挨着其他字符列?是的,每行都以字符列开头,后面跟着3个数字列。真正的答案是杀死以这种方式创建文件的天才。有一个很好的理由可以解释为什么大多数软件人员坚持在名称(文件、目录或变量)中不使用空格。这里真正的数据问题是名称中没有空格,而是名称中有空格并使用空格作为分隔符。如果原始文件使用制表符作为分隔符,当然没有问题。我同意,数据是从pdf中提取的,pdf格式非常糟糕。。。超级令人沮丧。在最初的帖子中(在你编辑它之前),OP的数据每行有多个观察值,所以我需要为每个空格分隔的单词做r2代码行?我没有做编辑;在OP编辑了他们自己的帖子后,我对标题做了一个小的编辑。很抱歉,原来的帖子应该看起来像现在的样子,我是从Android上发布的,它没有正确地记录新行。@Platy:不,它应该可以正常工作(即它应该替换字符向量中所有空格分隔的单词)。你试过了吗?
tmp <- sapply(strapplyc(r, pat), paste, collapse = sep)
read.table(text = tmp, col.names = col.names, as.is = TRUE, sep = sep)
tmp <- gsubfn(pat, ... ~ paste(..., sep = sep), r)
read.table(text = tmp, col.names = col.names, as.is = TRUE, sep = sep)
library(data.table)
tmp <- strapply(r, pat,
  ~ data.table(
      group = group, 
      x1 = as.numeric(x1), 
      x2 = as.numeric(x2), 
      x3 = as.numeric(x3)
    ))
rbindlist(tmp)
tmp <- strapply(r, pat,
  ~ data.frame(
      group = group, 
      x1 = as.numeric(x1), 
      x2 = as.numeric(x2), 
      x3 = as.numeric(x3),
      stringsAsFactors = FALSE
    ), combine = list, simplify = c)
do.call(rbind, tmp)
library(devtools) # source_url
source_url("https://gsubfn.googlecode.com/svn/trunk/R/read.pattern.R") # from dev repo

read.pattern(text = r, pattern = pat, col.names = col.names, as.is = TRUE)
read.table(pipe('perl -pe "s/(\\D+) (\\d+) (\\d+) (\\d+)/\\1\t\\2\t\\3\t\\4/" test'), sep='\t')
read_typed = function(file, types, sep=' ', ...){

  all_types = c('character' = '([\\w ]+)', 'integer' = '(\\d+)', 'numeric' = '([\\d.eE\\-+]+)', 'logical' = '([TF]|TRUE|FALSE)')
  command = paste0('perl -pe "s/', paste0(all_types[types], collapse=sep),
                   '/',
                   paste0('\\', seq_along(types), collapse='\t'),
                   '/" ', file)
  read.table(sep='\t', pipe(command), ...)
}
read_typed('test', c("character", 'integer', 'integer', 'integer'))