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
如何在R中读取此文件_R_Read.table - Fatal编程技术网

如何在R中读取此文件

如何在R中读取此文件,r,read.table,R,Read.table,我有以下文件: GroupA Whatever1 A B C GroupB Whatever2 C D GroupC Whatever3 E F G H 第1列和第2列应视为单独的列。每行的其余部分不应在制表符处拆分,而应成为第三列。下面是一个丑陋的方法: foo <- read.table( text="GroupA Whatever1 A B C GroupB Whatever2 C D GroupC Whatever3 E F G H", fill=T, header=F) foo

我有以下文件:

GroupA Whatever1 A B C
GroupB Whatever2 C D
GroupC Whatever3 E F G H
第1列和第2列应视为单独的列。每行的其余部分不应在制表符处拆分,而应成为第三列。下面是一个丑陋的方法:

foo <- read.table( text="GroupA Whatever1 A B C
GroupB Whatever2 C D
GroupC Whatever3 E F G H", fill=T, header=F)
foo2 <- data.frame( foo$V1, foo$V2, 
  V3=apply( foo[,-c(1,2)], 1, 
    function(x) paste0( x, collapse="\t")))

有更好的办法吗?最好是不需要先拆分然后再粘贴列的列?表中的一些行非常非常长。

可能是tidyr

> library(tidyr)
> unite(foo,foo_all,V3:V6,sep = "\t")
      V1        V2    foo_all
1 GroupA Whatever1  A\tB\tC\t
2 GroupB Whatever2   C\tD\t\t
3 GroupC Whatever3 E\tF\tG\tH

我会考虑一个字符串分割函数,它可以指定生成的片段的数量。例如,您可以使用“stringi”包中的

stri\u split\u fixed

这里,我假设您使用了
readLines
从文件中获取文本:

text <- c("GroupA Whatever1 A B C", 
          "GroupB Whatever2 C D", 
          "GroupC Whatever3 E F G H")

library(stringi)

stri_split_fixed(text, " ", 3, simplify = TRUE)
#      [,1]     [,2]        [,3]     
# [1,] "GroupA" "Whatever1" "A B C"  
# [2,] "GroupB" "Whatever2" "C D"    
# [3,] "GroupC" "Whatever3" "E F G H"

text为什么不使用
awk
对数据集进行一些命令行操作呢?(或其他语言,如python、perl等)

这里是一个使用
awk
的解决方案。首先,您需要知道数据集的最大列数:

foo=$(awk "BEGIN{max=0} {if(NF>max) max=NF} END{print max}" dataset_file_name)
现在,您可以使用awk脚本,将刚刚计算的参数传递给它,并将输出重定向到新文件:

awk -f my_script.awk -v max=$foo dataset_file_name > my_new_dataset
在R中,必须指定分隔符(空白):

[注意:
cut
的分隔符是选项卡,如果列分隔符不同,请使用
-d
选项(有关更多信息
cut--help
)。]


实际上,我看不出使用这种方法有什么真正的优势。。。但是我认为
cut
命令在其他一些场合可能有用。

这有一个缺点,即我仍然需要读取文件foo,不必要地将行剩余部分拆分为列。文件很大,有些行很长(数千个制表符分隔的名称),因此read.table创建了一个包含数千列的数据框,其中大部分为空。@January刚想出来…也许可以使用data.table中的
fread
单独读取列组。@January…更广泛地说,看起来readr和data.table的文件输入函数都是针对常规表格数据的。但它们都很快。使用这些工具之一读取完整文件,然后在内存中折叠它,可能不会有太大的损失。@joran,
fread
不会读取不规则(非矩形)数据。在
read.table
中没有与
fill=TRUE
等价的内容。目前,我已经解决了这一问题,方法是不使用分隔符(所有内容都在一列中)进行读取,并使用gsub将字符串拆分为三列。源文件中有分隔符还是只有空格?另外,前两列中是否有空格?
awk -f my_script.awk -v max=$foo dataset_file_name > my_new_dataset
bar <- read.table("my_new_dataset", sep=" ")
{
  printf("%s %s ", $1, $2);
  for(i=3; i<NF; i++) printf("%s/t", $i);
  printf("%s", $NF)
  if(NF<max)
    for(i=1; i<(max=1-NF); i++) printf("\t");
  printf("\n");
}
cut -f -2 dataset_file_name > dataset_columns_1_2
cut -f 3- dataset_file_name > dataset_rest_of_columns