【问题标题】:R conditionally bind rows in loopR有条件地在循环中绑定行
【发布时间】:2018-10-24 18:28:36
【问题描述】:

我在数据框及其行上有一个双 for 循环。我正在为数据帧的每一行应用一些计算(它们代表不同的电池,因此它们的值都不同)。最后,我想检查一行(例如电池)是否符合标准。如果是这样,我想把它放在一个新的 df 中,收集所有符合条件的电池。

df1 <- as.data.frame(matrix("values",nrow=24,ncol=19))
df2 <- as.data.frame(matrix("values",nrow=2976,ncol=22))
df3 <- df1[0,] #empty df of the same structure as df1

我在做什么:

for(i in 1:nrow(df1)){
  for(j in 1:nrow(df2)){

# some calculations giving me a result what the necessary capacity "nc" is
...

到目前为止一切正常。然后我想做的是比较df1中每一行的结果(例如必要的电池容量)是否大于条件“con”:

...
con <- df1[i,4]
nc <- max(df2[[20]])) # defining the necessary capacity
  if(con > nc){
   newdf <- bind_rows(df3,df1[i,])
  }
 } 
}

我希望 newdf 有 0 到最多 24 行。根据真实数据,我应该得到 11 个条目。我得到的是 1(那是 df1 的最后一行)或超过 30000 个条目。所以这没有按预期工作。有任何想法吗?谢谢!

【问题讨论】:

  • 如果您共享一些虚拟数据而不是“虚拟”数据,您会更快地获得帮助。另外,我感觉你甚至可能不需要 2 个 for 循环。
  • R 是一种矢量化语言,您不需要循环来创建新的数据框,只需执行过滤器并分配给新的 df:newdf&lt;-df[df[,4] &gt; nc, ]

标签: r loops if-statement double rbind


【解决方案1】:

我想你忘了增加df3,这就是为什么你只有一行,你总是将一行绑定到空的df3data.frame。您的代码以其他方式工作。你应该换行

newdf <- bind_rows(df3,df1[i,])

进入

df3 <- bind_rows(df3,df1[i,])

不过这可能会很慢,所以我建议您使用矢量化,例如 @Dave2i newdf&lt;-df[df[,4] &gt; nc, ] 在 cmets 中建议的那样

【讨论】:

    猜你喜欢
    • 2013-07-13
    • 2022-12-18
    • 2016-03-19
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多