在R中,如何创建一个循环来分割数据帧中的列

问题描述:

在R中,我想创建一个循环,它将我的数据框的前3000列写入一个文件,将下一个3000列写入另一个文件等等,直到所有的列都被分开为止。什么是最好的方法来做到这一点?我明白现在通过CRAN可以使用isplit和iterators函数,但我真的不确定如何去做这件事。有什么建议吗?在R中,如何创建一个循环来分割数据帧中的列

你可以尝试这样的:

library(plyr) 
max.col <- ncol(x) 
l_ply(seq(1, max.col, by=3000), function(i) 
    write.table(x[,i:min(i+2999, max.col)], file=paste("i", i, sep="-")) 
) 
+0

谢谢Shane的回复!我试了一下,结果是一个标题为“i”的2456列的文件 - 我认为这是循环的最后一次迭代?我的后续问题是,我现在如何修改此代码,以便我可以为输出的每个文件提供单独的名称?例如“i-1”,“i-2”,“i-3” 非常感谢您的帮助,它非常有用!我是编程/编码的绝对初学者。 – CCA 2010-07-06 20:56:05

+0

对不起......我的错误。我更新它以反映您的输出命名约定。 – Shane 2010-07-06 21:21:26

+0

谢谢Shane!另一个快速跟进 - 如果我想将这些文件输出到特定的文件夹中 - 比如说“i-1”进入文件夹“A-1”,则“i-2”按顺序进入文件夹“A-2” - 有没有办法让我在file = paste语句中指定它?或者我必须将所有文件写入一个文件夹,然后找到一种方法将它们复制/移动到相关的文件夹后?我试图避免这样做手动,因为最后会有数百个这样的文件。再次感谢您的详细和及时的答复 - 非常感谢! – CCA 2010-07-07 16:14:19

不知道为什么你会懒得装plyr ......假设你的数据帧DF ...(从巴蒂尔的回答偷明智地使用分钟()的)

maxCol <- ncol(df) 
for (i in seq(1, maxCol, by 3000)) { 
    write.table(df[,i:min(i+2999, maxCol)], "i") 
} 

您可能想要编辑上面的write.table命令以添加您的首选格式。

+0

在这个例子中'plyr'是不必要的(可以使用几乎所有的应用函数),但是它通常是值得的(这就是为什么我用它来演示)。这就是说,for循环允许副作用,所以我尽量避免它们,除非我想鼓励可能导致“不良”行为的因素。 – Shane 2010-07-06 20:23:39