【问题标题】:Making distinct data.frame with cbind and loop function使用 cbind 和循环功能制作不同的 data.frame
【发布时间】: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])}

其次,我想将结果保存在每个不同的对象中,例如t1t2t3、....、t10。所以,我运行了这段代码。

for (i in 1:10){
ti<-cbind(first,second[,i])}

但是,您可能会想,它会重复将结果保存在“ti”对象中。所以,ti 对象是first 数据帧+seconddata.frame 的第 10 列。

如何制作 10 个不同的对象,例如 t1t2t3t4 ...、t10

*补充问题:其实seconddata.frame在实际工作中是100多列。所以,产生的对象是t1t2,....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 &lt;- Map(cbind, list(first), X11=second) 。然后,如果您需要同时更改每个对象,您可以轻松地将 all_t 循环为 list
  • 沿着这条线......通过在每个步骤中添加“这么多行”来迭代地构建一个列表可能会在一段时间内“正常”,但因为它会在每次调用时复制所有数据cbind,它的扩展非常可怕,最终会花费比必要的更长的时间。

标签: r loops dataframe


【解决方案1】:

一个选项是lapply。遍历“second”和cbind 的列以在“first”中创建一个新列,将list 的名称设置为选择的名称。正如@thelatemail 提到的(并且完全同意),最好不要在全局环境中创建对象,而是使用lapply/sapply/vapply 等工具从list 本身保存、存储、处理和写入。

lst1 <- lapply(second, function(x) cbind(first, newcol = x))
names(lst1) <- paste0("t", seq_along(lst1))

由于它是list,我们可以使用lapply 循环遍历列表

lapply(lst1, function(x) predict(originalfunction, newx = x, matrix = TRUE))

【讨论】:

  • 成功了。我真的很感谢你的回答。然而,有一个新的问题。我在这个答案下添加了关于它的解释。你会回答吗?
  • @ESKim 不清楚原始功能,请查看我的更新答案
  • 哦,由于社区规则,我的问题已被删除。但是,它奏效了!我真的很感激。 apply 功能真的很有用。
  • @ESKim 我认为它已被删除,因为您应该编辑问题并在那里更新。很高兴我的更新解决方案很有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多