我有很多測量結果,我得到的資料看起來像這樣:
# Generate example data
x <- 1:100
y <- 100*(1-exp(-0.3*x))
x2 <- 101:200
y2 <- rev(y)
df <- data.frame("x" = c(x, x2),
"y" = c(y, y2))
df$x <- df$x 50
rm(x, x2, y, y2)
x <- 1:50
y <- 25.91818
x2 <- 251:300
y2 <- 25.91818
df2 <- data.frame("x" = c(x, x2),
"y" = c(y, y2))
rm(x, x2, y, y2)
df <- rbind(df, df2)
rm(df2)
如果我繪制這個,我可以看到有最左邊和最右邊的區域最小值。
library(ggplot2)
p <- ggplot(df, aes(x,y))
geom_line()
geom_point(data = data.frame("x" = c(50, 250), "y" = c(25.91818, 25.91818)),
mapping = aes(x, y), colour = "red")
scale_y_continuous(limits = c(0, 101))
p annotate("text", label = "minimum 1", x = 50, y = 20)
annotate("text", label = "minimum 2", x = 250, y = 20)

我想做的是修剪那些minimum 1在minimum 2. 這不是很簡單,因為這兩點之間也可能存在區域最小值,因為真實資料看起來并不理想。我還需要將此程序應用于許多樣本,但我認為這可能是微不足道的,因為我可以使用 egdplyr和group_by().
我有一些運氣使用包繪制區域最小值ggpmisc,但我不確定如何使用它來實際子集我的資料。為了清楚起見,我在下面包含了執行此操作的代碼,并且使用真實資料看起來會更好一些:
library(ggpmisc)
p2 <- ggplot(df, aes(x, y))
geom_line()
ggpmisc::stat_peaks(col="red", span=3)
p2

我希望這很清楚,我很樂意澄清任何問題。先感謝您。
uj5u.com熱心網友回復:
您可以使用以下步驟執行此操作:
- 根據資料的 x 坐標對資料進行排序
- 在您排序的資料上,找到
diffy 坐標,對于兩端的平坦部分(以及中間的任何平坦部分),該坐標將為 0(或接近 0) - 從左邊開始,找到
diff不為零(或至少高于最小閾值)的第一個點。將此索引存盤為名為的變數left - 從右邊開始,找到
diff不為零(或至少高于最小閾值)的第一個點。將此索引存盤為名為的變數right - 子集您的資料框,使其僅包含行之間的資料
left:right
因此,在您的示例中,我們將擁有:
# Define a minimal threshold above which we are not at the minimum line
minimal_change <- 1e-6
df <- df[order(df$x),] # Step 1
left <- which(diff(df$y) > minimal_change)[1] # Step 2
right <- nrow(df) - which(diff(rev(df$y)) > minimal_change)[1] 1 # Step 3
df <- df[left:right, ] # Step 4
現在我們可以繪制結果:
ggplot(df, aes(x, y))
geom_line()
geom_point(data = data.frame("x" = c(50, 250), "y" = c(25.91818, 25.91818)),
mapping = aes(x, y), colour = "red")
scale_y_continuous(limits = c(0, 101))
scale_x_continuous(limits = c(0, 300))

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/453836.html
上一篇:格式不適用于箱線圖中的奇異點
下一篇:如何鏡像HBITMAP
