2017-03-01 23 views
0

我是一位新的R用户。如何为数据框中的每个列创建多个文本文件并保留第一列?

我有一个包含503列的excel文件。第一列表示组,而第二列直到最后一列是数字特征。

Groups  length width ellip ... nth_trait 
AAA   2   1  7   1 
BBB   4   5  6   0 
CCC   1   6  3   5 

我想创建文本文件在一个运行的每个特征的文件名基于特质。代码如下所示:

raw <- read_excel("raw_data.xlsx", sheet = 1) 
raw_df <- as.data.frame(raw) 

for (i in names(raw_df)) { 
raw_file <- paste(i, ".txt", sep = "") 
write.table(raw_df[[i]], raw_file, sep = "\t", quote = F, row.names = F, col.names = T, append = F) 
} 

输出包含503个文本文件。每个文件只包含一个与数据框中每列对应的列。

但我期望每个文本文件的输出必须由第一列(组名),然后性状,如以下所列:

length.txt 

Groups  length 
AAA   2 
BBB   4 
CCC   1 

width.txt 

Groups  width 
AAA   1 
BBB   5 
CCC   6 

我应如何修改代码?请帮助。

+0

组似乎不是行名称,而是一个单独的列。如果这是真的,你可以用'raw_df [[c(1,i)]]'替换'raw_df [[i]]'。如果它确实存储在行名称中,则将'row.names = F'更改为'row.names = TRUE'。 – lmo

+0

是的,这些组在单独的列。我编辑了这个问题。正如你所建议的那样,我尝试用raw_df [[c(1,i)]替换raw_df [[i]],但是我得到这个错误:.subset2(x,i,exact = exact)中的错误:no这样的索引在第1级。 – lala

+0

当我运行iris [[c(1,i)]]'其中'i = 5'时,它返回一个单独的值,而不是一列。 –

回答

1

在你write.table功能,请尝试使用cbind加入与任何列中的循环引用的第一列:

write.table(cbind(raw_df[1], raw_df[i]), raw_file, sep = "\t", quote = F, row.names = F, col.names = T, append = F)

这应该工作,在此基础上例如:

lapply(1:5, function(x){cbind(iris[1],iris[i])})

+0

这个伎俩。谢谢。 – lala

相关问题