运行循环时创建数据框的子集

时间:2017-08-07 14:55:19

标签: r for-loop subset

我是R的新手,试图找到我的原因。我创建了一个基于"原始"的新数据框架。数据框。

library(dplyr)
prdgrp <- as.vector(mth['MMITCL'])
prdgrp %>% distinct(MMITCL)

执行此操作时,结果是MMITCL列的唯一值列表。我想在循环序列中使用这些数据,首先创建原始数据的新子集,然后基于此打印图形:

#START LOOP
for (i in 1:length(prdgrp))
{
# mth[c(MMITCL==prdgrp[i],]
mth_1 <- mth[c(mth$MMITCL==prdgrp[i]),]
# Development of TPC by month 
library(ggplot2)
library(scales)
ggplot(mth_1, aes(Date, TPC_MTD))+ geom_line()
}
# END LOOP

这样做会给我以下错误消息:

Error in mth$MMITCL == prdgrp[i] : 
  comparison of these types is not implemented
In addition: Warning:
I `[.data.frame`(mth, c(mth$MMITCL == prdgrp[i]), ) :
  Incompatible methods ("Ops.factor", "Ops.data.frame") for "=="

我做错了什么。

1 个答案:

答案 0 :(得分:1)

如果您只想绘制输出,则无需对数据帧进行子集化,只需将ggplot放入循环(或更可能使用facet_wrap)就更简单了。如果没有看到您的数据,就很难给出准确的答案。但是,下面有两个通用的虹膜示例 - 希望这些也会显示您在子设置数据帧时出错的位置。请让我知道,如果你有任何问题。

library(ggplot2)

#looping example
for(i in 1:length(unique(iris$Species))){
  g <- ggplot(data  = iris[iris$Species == unique(iris$Species)[i], ], 
              aes(x = Sepal.Length, 
                  y = Sepal.Width)) +
    geom_point()
  print(g)
}

#facet_wrap example
g <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point() +
  facet_wrap(~Species) 
g

但是,如果您需要保存数据框供以后使用,一个选项是将它们放入列表中。如果您只需要在循环中保存数据框,则可以删除列表并使用您希望的任何变量名称。

myData4Later <- list()

for(i in 1:length(unique(iris$Species))){
  myData4Later[[i]] <- iris[iris$Species == unique(iris$Species)[i], ]
  g <- ggplot(data  = myData4Later[[i]], 
              aes(x = Sepal.Length, 
                  y = Sepal.Width)) +
    geom_point()
  print(g)
}