如何在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