我在一个data.table中读取了一个csv文件,如下所示:
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)
使用apply()
函数将每一行设为列表,然后使用sink()
循环内的for
输出。然后检查您的工作目录以查看文件File1.txt
,File2.txt
,File3.txt
和File4.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()
}