2016-07-25 88 views
1

文本文件我有一个读CSV文件成如下一个data.table:写每个data.table列单独的R中

 Cat1 Cat2 Cat3 Country file_name 
1: A E B  Canada first 
2: C B   India  Second 
3: C    Canada third 
4: B    Ireland Fourth 
5: C A   India  fifth 
6: A C F  Canada  Sixth 

我使用下面的代码来写每个内容行到一个单独的文本文件:

lapply(1:nrow(df), function(i) write.table(df[i], file= paste0("./TextFiles/", df[i, file_name], ".txt"), row.names = F, col.names = F, quote = F)) 

现在我正写的输出是“Sixth.txt”(例如)如下:

A C F Canada Sixth 

不过,我希望文字如下:

Cat1 
A 

Cat2 
C 

Cat3 
F 

Country 
Canada 

有没有办法得到这个输出,而不嵌套很多lapply

试图代码:

lapply(df, function(i) i) 

给出了输出:

$Cat1 
[1] "A" "C" "C" "B" "C" "A" 

$Cat2 
[1] "E" "B" "" "" "A" "C" 

$Cat3 
[1] "B" "" "" "" "" "F" 

$Country 
[1] "Canada" "India" "Canada" "Ireland" "India" "Canada" 

$file_name 
[1] "first" "Second" "third" "Fourth" "fifth" "Sixth" 

所以,我有一种感觉,可以在内容之前拿到列的名称,并插入线在每个列条目之前。但是,我无法找到办法做到这一点。

+0

你希望它被纵向打印文件输出?就像我们可以在控制台中看到的一样,或者像单独的文本文件中的每行一样好,列名如下?让我知道如果你想在下面的结果进行一些更改。 –

+0

@ SowmyaS.Manian:我不希望他们像下面的答案那样成为表格的形式。实际上,我会将文本文件导入RQDA。所以,我需要将这些行依次打印,就像我在问题中所显示的一样。 – DotPi

+0

@ SowmyaS.Manian:谢谢。有用。有没有办法像我在问题中显示的那样将其中一列中的数据用作文件名? – DotPi

回答

0

使用apply()函数将每行设置为一个列表,然后在for循环内使用sink()输出它。然后检查您的工作目录以查看文件File1.txtFile2.txtFile3.txtFile4.txt。文件名可以使用strsplit()被提取,并且可以添加到使用Result[[i]]$file_name

library(data.table) 
    df <- data.frame(a=1:4,b=9:12,c=3:6,d=0:3) 
    df <- data.table(df) 

    df 
    # a b c d 
    # 1: 1 9 3 0 
    # 2: 2 10 4 1 
    # 3: 3 11 5 2 
    # 4: 4 12 6 3 

    Result = apply(df,1,as.list) 


for(i in 1:length(Result)){ 
sink(paste("File",i,".txt",sep="")) 
Result[[i]]$file_name <- strsplit(paste("File",i,".txt",sep=""),"\\.")[[1]][1] 
print(Result[[i]]) 
sink() 
} 

enter image description here

相关问题