【问题标题】:subsetting removing too many rows子集删除太多行
【发布时间】:2016-06-15 22:29:13
【问题描述】:

鉴于以下数据:

# 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 个数字。 例如,我们在四个珊瑚礁上拥有三个物种(Admiral Ma 和 Grecian Ma - 1 个物种和 2 个珊瑚礁,Jaap Mf - 1 个物种和 1 个珊瑚礁,以及鳄鱼先生 - 1 个物种和 1 个珊瑚礁)。 我想要的是首先将 Reef Ma 添加到情节中 - 这将是第一个数字。

接下来我想添加另一个物种(比如)Reef Mf,其中包括上一个图 - 这将是第二个图。

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

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

注意:上面的数据是下面绘制的一小部分

#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

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 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 在绘制子集时似乎删除了图中的多个点。

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

【问题讨论】:

  • subset 条件中使用%in% 而不是== 来检查ReefSpecies 是否与指定的任何名称匹配。
  • @MikkoMarttila 我试过了,但它说找不到函数,我收到这个错误Error in eval(expr, envir, enclos) : could not find function "%n%"
  • @MikkoMarttila 忽略最后一条评论 - 这确实有效!谢谢!我需要尝试%in% 而不是%n%
  • 作为对未来的一点建议 - 在解决问题之前先缩小范围。这根本不是ggplot 问题,也不是绘图问题。这是一个如何对数据进行子集化的问题。如果您看到一个看起来错误的图,您应该做的第一件事是检查您提供给该图的数据框是否正确。在这种情况下,情况并非如此,而且您已将问题缩小到一行代码。
  • difference between %in% VS ==。它们完全不同。使您的子集与== 一起工作的方法是subset(Seasonal, ReefSpecies == "Gregcian O. faveolata" | ReefSpecies = "Jaap O. faveolata" | ReefSpecies == ...)

标签: r subset


【解决方案1】:

当你比较不同长度的向量时,较短的向量会被回收以匹配较长向量的长度,然后进行逐元素比较。这是一个小例子:

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

您想要作为子集的名称向量被回收到数据的长度,然后根据回收的名称向量上的相应元素检查每条记录。只有ReefSpecies 的值恰好与名称的回收向量中的值对应的观察值才包含在子集数据中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多