子集删除太多行

时间:2016-06-15 22:29:13

标签: r subset

鉴于以下数据:

# Import mock data
Biomass <- c(20, 10, 5, 4, 5, 7, 8, 22, 13, 13, 15, 18, 2, 5, 7, 10)
Season <- c("Winter", "Spring", "Summer", "Fall")
Year <- c("1", "2", "3", "4")
ReefSpecies <- c("Admiral Ma", "Jaap Mf", "Grecian Ma", "Alligator Mr", "Jaap Mf", "Grecian Ma", "Alligator Mr", "Admiral Ma", "Grecian Ma", "Alligator Mr", "Admiral Ma", "Jaap Mf", "Alligator Mr", "Admiral Ma", "Jaap Mf","Grecian Ma")
Seasonal <- data.frame(Biomass, Season, Year, ReefSpecies)
Seasonal$Times <- paste(Seasonal$Year, Seasonal$Season, sep=" ")
Seasonal$Time <- factor(Seasonal$Times, levels=unique(Seasonal$Times))


# Plot figure
ggplot(data = Seasonal, aes(Time,  Biomass, color=ReefSpecies)) + 
geom_point() +
geom_smooth(aes(group=ReefSpecies), method="lm") +
theme(axis.text.x = element_text(angle = 270)) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
      panel.background = element_rect(colour="black", size=1, fill=NA), axis.line = element_line(colour = "black")) +
theme(legend.position = "top") +
xlab("Year") +
ylab(bquote("Ash-free Biomass (mg/cm"^"2"*")"))

我想制作一个3个数字,分别添加每个物种。 例如,我们有三个物种超过四个珊瑚礁(海军上将Ma和Grecian Ma - 1种和2个珊瑚礁,Jaap Mf - 1种和1种珊瑚礁,以及鳄鱼先前1种和1种珊瑚礁)。 我想要的是首先将 Reef Ma添加到情节中 - 这将是第一个数字。

接下来我想添加另一个物种(比方说) Reef Mf,其中包括上一个数字 - 这将是第二个情节。

由于最后一个情节包含了所有数据,我知道该怎么做 - 只需要帮助前两个数字。

下面是我能够实现的图像 - 您将看到使用此方法并非包含所有数据点(与一个图中所有数据的其他图像相比) - 两个图形的代码都附加为好。

注意:以上数据是下面列出的一小部分

Subsetted - not all data included

#Subsetted dataset with missing points
ggplot(subset(Seasonal, ReefSpecies == c("Grecian O. faveolata", "Jaap O. faveolata", "Alligator O. faveolata", "Admiral O. faveolata")), 
   aes(Time, Biomass, color = ReefSpecies)) +
  geom_point() +
  geom_smooth(aes(group=ReefSpecies), method="lm") +
  theme(axis.text.x = element_text(angle = 270)) +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
    panel.background = element_rect(colour="black", size=1, fill=NA), axis.line = element_line(colour = "black")) +
  theme(legend.position = "top") +
  xlab("Year") +
  ylab(bquote("Ash-free Biomass (mg/cm"^"2"*")")) 

这是我想要的第一个数字的例子 - 它包括所有相同的物种,但也来自我所有的研究地点。

此外,我收到此警告消息 - 我认为这意味着它试图为子集绘制相同数量的点,但R警告对我来说几乎可以是外语。

Warning message:
In ReefSpecies == c("Grecian O. faveolata", "Jaap O. faveolata",  :
  longer object length is not a multiple of shorter object length

Subsetted data with 2 species

ggplot(subset(Seasonal, ReefSpecies == c("Grecian O. faveolata", "Jaap O. faveolata", "Alligator O. faveolata", "Admiral O. faveolata", "Grecian O. annularis", "Jaap O. annularis", "Alligator O. annularis", "Admiral O. annularis")), 
   aes(Time, Biomass, color = ReefSpecies)) +
  geom_point() +
  geom_smooth(aes(group=ReefSpecies), method="lm") +
  theme(axis.text.x = element_text(angle = 270)) +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
    panel.background = element_rect(colour="black", size=1, fill=NA), axis.line = element_line(colour = "black")) +
  theme(legend.position = "top") +
  xlab("Year") +
  ylab(bquote("Ash-free Biomass (mg/cm"^"2"*")")) 

这是我想要的第一个数字的例子 - 它包括所有相同的物种,但也来自我所有的研究地点。

此情节也会出现同样的警告信息

Whole data set

注意:子图中的红线对应于整个数据图中的金线

子图中的蓝线对应于整个数据图中的蓝线

子图中的绿线对应于整个数据图中的绿线

子图中的紫色线对应于整个数据图中的紫色线

# Whole Dataset
ggplot(data = Seasonal, aes(Time,  Biomass, color=ReefSpecies)) + 
geom_point() +
geom_smooth(aes(group=ReefSpecies), method="lm") +
theme(axis.text.x = element_text(angle = 270)) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
      panel.background = element_rect(colour="black", size=1, fill=NA), axis.line = element_line(colour = "black")) +
theme(legend.position = "top") +
xlab("Year") +
ylab(bquote("Ash-free Biomass (mg/cm"^"2"*")"))

从这两个数字中可以看出 - ggplot似乎在绘制子集时删除了图中的多个点。

任何帮助将不胜感激,如果您需要更多信息,请告诉我,并提前感谢您!

1 个答案:

答案 0 :(得分:2)

当您比较不同长度的矢量时,将较短的矢量再循环以匹配较长矢量的长度,然后进行逐元素比较。这是一个小例子:

XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new StringReader(XML));
String theaterName = null;
while (xmlStreamReader.hasNext()) {
    if (xmlStreamReader.next() == XMLStreamConstants.START_ELEMENT) {
        if ("theatername".equals(xmlStreamReader.getLocalName())) {
            theaterName = xmlStreamReader.getElementText().trim();
        }
    }
}
System.out.println(theaterName);

您希望子集化的名称向量被循环到数据的长度,然后根据名称的再循环向量上的相应元素检查每个记录。只有x <- c(1, 1, 0, 0, 2) y <- c(1, 0) # compare x with a shorter vector y x == y # [1] TRUE FALSE FALSE TRUE FALSE # the previous is actually the same as x == c(y, y, y[1]) x == c(1, 0, 1, 0, 1) # [1] TRUE FALSE FALSE TRUE FALSE # to check for each element of x if it matches any element in y x %in% y # [1] TRUE TRUE TRUE TRUE FALSE 的值恰好与回收的名称向量中的值相对应的观察结果才包含在子集数据中。