【发布时间】: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<-df[df[,4] > nc, ]
标签: r loops if-statement double rbind