在 R 中使用区间数据创建散点图

Create scatter plot with interval data in R

这个问题的答案可能很明显,但我就是想不通(或者更确切地说,我想我知道一个解决方案,但对我来说似乎很复杂),所以我想我应该问寻求帮助。

我的数据是这样的:

MyItem Measurement First Last
Item1  10          267.4 263.2
Item2  15          263.2 254.8
Item3  3           250.5 250.5
Item4  20          266.9 253.2
Item5  16          260.0 250.0

我对第一项的测量在 267.5 到 263.2 之间有效(任意时间单位;可以是秒、年、...)。第二项的测量值从263.2到254.8等有效。

我想在 R 中创建一个图,其中 x 轴代表时间,y 轴代表我们的测量值。时间应该被划分为长度为 1 的间隔。如果我们测量的间隔与 x 轴的时间间隔重叠,那么我们的图中应该会出现一个数据点(在 x 轴上的时间间隔的中间)。 举个例子:假设我们的 x 轴从 269 开始,到 249 结束。 我们在 x 轴上的第一个时间间隔从 269 到 268。我们的 None 测量值落在这个时间间隔内,因此没有绘制数据点。 我们在 x 轴上的第二个时间间隔从 268 变为 267。已针对此时间间隔记录了 Item1 的测量值。因此,在我们的时间间隔 268-267 中绘制了一个数据点,其中 y=10(我们的测量值)和 x=267.5(我们的时间间隔 268-267 的中点)。 我们的第三个时间间隔从 267 变为 266。我们的两个测量值落入此时间间隔,即 Item1 和 Item4。因此,应绘制两个数据点,坐标为 y=10、x=266.5(Item1)和 y=20、x=266.5(Item4)。 对于其余数据,我们这样处理。

不幸的是,我还没有找到一个聪明的方法 function/package 在 R 中执行此操作 - 通常您只能为 y 轴提供一个值(这是有道理的,否则 x 值的映射变得模棱两可) - 但我确定一定有什么。我认为通过使用 seq() 我可以为每个时间步长创建虚拟值(例如,Item1 的虚拟值将是 267.5、266.5、265.5、264.5、263.5 - 所有这些都与 y=10 相关联)并添加这些值到我的数据。但这在我看来是一个非常复杂的解决方案,远非优雅。

我相信一定有一种简单而优雅的方法可以做到这一点,但我想不出。我什至不知道我应该寻找什么——我以为你会在时间序列分析中看到这个问题,但事实似乎并非如此。我不想做的是取时间间隔开始和结束之间的平均时间(例如,对于 Item1 267.5+263.2/2 = 265.35)。

如果可能的话,我想用 ggplot2 绘制散点图(但我采用任何解决方案),然后通过我绘制的数据点拟合一条线。

在此先感谢您的帮助!

我对不涉及将您的数据转换为 "long" 数据的解决方案不知所措。但我也不认为它作为一种策略特别不雅——但也许我们在这一点上意见不一。这是一个使用 lapply() 和 rbind 生成长版本数据的快速、简短的解决方案:

# Convert data.frame to list, split on MyItem
dl <- split(df, df$MyItem)

# For each item, create a data frame with the measurements and a sequence of the intervals
lapply_output <- lapply(dl, function(item){
    out_df <- data.frame('MyItem' = item$MyItem,
                         'Measurement' = item$Measurement,
                         'Interval' = seq(floor(item$First), floor(item$Last))+ 0.5)
    return(out_df)
})
# Take the list of data frames and bind them together
long_data <- do.call(rbind, lapply_output)

# Plot using ggplot
p <- ggplot(long_data, aes(Interval, MyItem)) + geom_point()

也许其他人有一个更快的解决方案,使用为重新格式化数据框而制作的众多软件包之一。

这不是特别新颖,但它是一种捕获所有三个变量(第一个、最后一个、测量值)的简单方法,x 轴为时间,y 轴为测量值。

plot(df$First, df$Measurement, pch=20, xlim=c(250,270),
    xlab="Time", ylab="Measurement")
points(df$Last, df$Measurement, pch=20)
segments(df$First, df$Measurement, df$Last, df$Measurement)