【问题标题】:Append in a for loop在 for 循环中追加
【发布时间】:2018-10-04 00:46:39
【问题描述】:

我正在尝试使用从名为 kc2 到 kc10 的不同数据帧中的值创建此类列表。有人给我一些建议如何制定这个for循环吗?

sum_square=append(sum_square,weighted.mean(x=kc2$withinss,w=kc2$size, na.rm=TRUE))

我尝试了类似的方法,但没有成功:

for (i in 2:10){
   nam1 = paste0("kc",i,"$withinss")
   nam2 = paste0("kc",i,"$size")
   sum_square = append(sum_square, lapply(c(as.numeric(nam1),as.numeric(nam2)), weighted.mean))
 }

【问题讨论】:

  • 将代码以纯文本形式放回,而不是图像...
  • 有关格式化帮助,请参阅stackoverflow.com/help/formatting
  • peteraa,意识到我们大多数人都在自愿提供时间来提供帮助;请通过使示例尽可能可复制和可重现,让我们更容易提供帮助。您的目标是使其易于理解(美学,您的问题/需求/期望的清晰性)和易于复制(不要要求我们转录您可以轻松复制到问题文本框中的数据)。如果不出意外,如果你没有花太多时间在问题上,我为什么要花任何时间来回答?
  • sry 伙计们在这里还是个新手。会做得更好
  • peteraa,有一些有代表性的数据会很有帮助。请阅读minimal working examples 和关于reproducible examples 的良好SO 问答,例如添加dput(head(kc2)) 的输出可能在这里有用。但真的,请阅读链接,从长远来看,它将帮助您帮助我们。

标签: r for-loop assign


【解决方案1】:

你发布的代码有很多问题,所以我直接切入正题。在 R 中,当你想将一个函数应用于多个对象并收集结果时,你应该考虑使用lapplylapply 循环遍历对象列表(您可以将数据框放入列表中),将所选函数应用于每个对象,然后将每个对象的结果作为列表返回。下面的代码是你想要的形式:

# Add data frames to list by name
list_of_data_frames <- list(kc2, kc3, kc4, kc5, kc6, kc7, kc8, kc9, kc10)
# OR add them programatically
list_of_data_frames <- mget(paste0('kc', seq.int(from = 2, to = 10)))

result <- lapply(list_of_data_frames,
                 function(x) weighted.mean(x = x$withiniss, w = x$size, na.rm=TRUE))

【讨论】:

  • 感谢您的回复。但是我仍然收到此错误: x$withiniss 中的错误:$ 运算符对原子向量无效
  • 您的数据框是否放入列表list_of_data_frames
  • 正如@Aaron 所说,您需要将数据框放入列表中。如果您为上述函数提供一个列表,它将将该函数应用于列表的每个元素(在您的情况下为每个数据框)。但是,如果您给它一个 data.frame,它会将其应用于该 data.frame 中的每个 variable/column,这就是您收到该错误的原因。
猜你喜欢
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 2013-03-09
  • 2019-03-09
  • 2016-11-30
相关资源
最近更新 更多