【发布时间】:2019-11-17 12:22:32
【问题描述】:
我正在使用 cbind 和循环函数生成多个数据表。
假设我有两个 data.frame。每个data.frame为100*10。
first<-data.frame(replicate(10,sample(0:1,100,rep=TRUE)))
second<-data.frame(replicate(10,sample(2:10,100,rep=TRUE)))
seconddata.frame的每一列与firstdata.frame绑定,生成十个100*11的data.frame(seconddata.frame的第一列+一列)。
所以,我创建了这样的循环函数。
for (i in 1:10){
cbind(first,second[,i])}
这个函数有两个问题。
首先。运行后,什么也没发生。只有这个语法出现在控制台窗口中。
> for (i in 1:10){
+ ti<-cbind(first,second[,i])}
其次,我想将结果保存在每个不同的对象中,例如t1、t2、t3、....、t10。所以,我运行了这段代码。
for (i in 1:10){
ti<-cbind(first,second[,i])}
但是,您可能会想,它会重复将结果保存在“ti”对象中。所以,ti 对象是first 数据帧+seconddata.frame 的第 10 列。
如何制作 10 个不同的对象,例如 t1、t2、t3、t4 ...、t10?
*补充问题:其实seconddata.frame在实际工作中是100多列。所以,产生的对象是t1,t2,....t100,....并继续。有没有办法保存这些有组织的对象?
*Akrun 回答的附加问题
非常感谢您的帮助。成功了!
但是,有一个新问题。我想要处理的结果有点复杂。
让我们以lst1 列表中的t1 obejct 为例。这需要两个步骤。
我想用t1 对象执行data.matrix 函数,并将data.matrix 的结果放入predict 函数中。 (由于函数原因,predict的原函数只能计算data.matrix)
如果是data.frame,我会跑
data.matrix(t1)
predict(orginalfunction,newx=t1,matrix=TRUE)
但是,在阅读了您的答案后,我认为将lapply 与列表一起使用是正确的。 data.frame 太乱了。
但是,如何将data.matrix 函数应用于列表的每个对象并将其放入predict 函数中?
【问题讨论】:
-
通常的答案是不创建
t1-to-tN对象,而是创建一个列表,例如 -all_t <- Map(cbind, list(first), X11=second)。然后,如果您需要同时更改每个对象,您可以轻松地将all_t循环为list。 -
沿着这条线......通过在每个步骤中添加“这么多行”来迭代地构建一个列表可能会在一段时间内“正常”,但因为它会在每次调用时复制所有数据
cbind,它的扩展非常可怕,最终会花费比必要的更长的时间。