2017-03-06 140 views
0

間隔數據散點圖回答這個問題可能比更爲明顯,但我不能左右我的頭(或者更確切地說,我想我知道一個解決方案,但它似乎複雜的我),所以我想我應該尋求幫助。創建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,並結束於在x軸249 我們第一時間間隔去從269 268無我們的測量落入該時間間隔,因此沒有數據點繪製。 我們在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)。 我們繼續爲我們其餘的數據。

不幸的是,我還沒有找到一個智能函數/軟件包在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散點圖(但我採取任何解決方案),然後通過我的繪製數據點擬合線。

在此先感謝您的幫助!

+0

我想你可能會得到一個編程網站的更多幫助,因爲這是不是一個真正的有關統計數據本身的問題。 – 2017-03-06 17:02:06

+0

嗯,謝謝!如果是這樣的話,我可能應該將主題移到Stackoverflow:這是可能的還是我必須重新創建發佈? – user6475

+0

我不是移植協議方面的專家,我建議的唯一的事情是,如果你自己做,你必須在這裏刪除它,因爲交叉張貼會讓人煩惱。 – 2017-03-06 17:13:12

回答

0

對於不涉及將數據轉換爲「長」數據的解決方案,我很遺憾。但我也不認爲這是一種非常不雅的策略 - 但也許我們在這一點上不同意。下面是使用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() 

也許別人已經使用重新格式化的數據幀進行的許多包的一個更快的解決方案。

+0

非常感謝您的幫助!這的確的確有效:雖然我確實有類似的想法,但它絕對比我的解決方案更優雅。儘管如此,我現在還是不會提出這個問題,因爲我仍然認爲這個問題必須有更簡單的解決方法。你會認爲其他人已經不得不處理這樣的問題。 – user6475

+0

@ user6475很高興你發現它優雅!是的,希望有人會想出更新穎的東西,我們都會從中學習。 –

0

這不是特別新穎,但它與時間捕捉到所有三個你的變量(第一,最後,測量)在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) 

Line plot

+0

非常感謝!是的,事實上,這也是有效的,代表性是一種很好的開箱即用的思維方式。我相信我不會想出這個,非常感謝! 如果我想通過我繪製的數據點(這也考慮範圍)擬合一條線,我想我仍然必須使用一種類似於所提出的@Jammeth_Q的方法。 – user6475

+0

到目前爲止,我發現這兩個答案都非常有用:@Jammeth_Q的答案完全符合我的要求,並且允許曲線擬合,但不如您的答案簡單(但絕對比我的方法更優雅)。另一方面,您的答案繪製的數據與我腦海中的數據不同(但以非常聰明的方式),不允許在當前狀態下進行曲線擬合(據我所知),但確實如此實施起來非常簡單。 – user6475

+0

我仍然要保持這個問題的公開性,以查看是否有其他方法將您的方法的簡單性與@ Jammeth_Q答案的靈活性(可能不必依賴seq()或segments())相結合。 非常感謝! – user6475