[英]Incrementally iterating through a dataframe column n times in R
因此,首先,請原諒我對R的無知。我仍然很陌生。
我為接下來的幾天要執行的實驗創建了一個模擬數據集df。 數據將如下所示:
well time area
a1 0 100
a1 8 88
a1 16 78
a1 24 33
a2 0 96
a2 8 91
a2 16 69
a2 24 41
a3 0 98
a3 8 60
a3 16 24
a3 24 2
a4 0 89
a4 8 63
a4 16 49
a4 24 27
...
其中“好”是樣品編號,“時間”是實驗過程中的時間,“面積”是我要測量的對象的面積。 我想確定在每個時間點(0、8、16、24)的每口井,相對於時間0時該井的初始面積,所測量的面積發生了多少變化。
為此,我想在數據框中添加一列名為“ percent_initial_size”。 在此列中,我需要計算每個時間點的初始測量面積(在時間0)的百分比。 通用公式如下所示:
(area_at_timeX/area_at_time0)*100
為了幫助弄清我要做什么,這是我希望數據集看起來的樣子:
well time area percent_initial_size
a1 0 100 100
a1 8 88 88
a1 16 78 78
a1 24 33 33
a2 0 96 100
a2 8 91 94.79
a2 16 69 71.88
a2 24 41 42.71
a3 0 98 100
a3 8 60 61.22
a3 16 24 24.49
a3 24 2 2.04
a4 0 89 100
a4 8 63 70.79
a4 16 49 55.06
a4 24 27 30.34
...
因此,對於df $ percent_initial_size中的2-5行,我需要在df $ area的第2行(時間0的區域)中引用單個值。 然后,對於df $ percent_initial_size中的6-9行,我需要引用df $ area第6行(也是時間0的區域)。 我正在嘗試編寫一個腳本來遵循這種模式,直到我的數據集結束為止(大約500行)。 希望這是有道理的。
我知道一些基本的軟件包(dplyr,tidyr,reshape2等),但是我對如何執行此操作感到茫然。 我已經嘗試了幾種解決此問題的方法,但是我對R不夠熟悉,無法完全解決它。 有沒有人可以對此提供幫助,或者至少將我引向一些可能有幫助的文檔? 我不確定在數據為格式時是否可以做我想做的事情,或者是否需要重新格式化數據框,進行計算,然后將其轉換回原始格式以便在ggplot2中進行繪圖。 非常感謝!
library(data.table)
setDT(dat)[,percent_initial_size:=area/area[1]*100,by=well]
dat
well time area percent_initial_size
1: a1 0 100 100.000000
2: a1 8 88 88.000000
3: a1 16 78 78.000000
4: a1 24 33 33.000000
5: a2 0 96 100.000000
6: a2 8 91 94.791667
7: a2 16 69 71.875000
8: a2 24 41 42.708333
9: a3 0 98 100.000000
10: a3 8 60 61.224490
11: a3 16 24 24.489796
12: a3 24 2 2.040816
13: a4 0 89 100.000000
14: a4 8 63 70.786517
15: a4 16 49 55.056180
16: a4 24 27 30.337079
要使用dplyr
軟件包:
library(dplyr)
dat%>%group_by(well)%>%mutate(percent_initial_size=area/area[1]*100)
library(dplyr)
df %>%
# perform operations separately for each well
group_by(well) %>%
# make sure time zero is in the first position
arrange(time) %>%
# divide each area by the first area value for the group (i.e. time zero for the well)
mutate(percent_initial_size = area / area[1] * 100)
考慮這些問題的訣竅在於了解mutate
表達式中正在發生的事情。 就像df$area
在正常情況下所做的那樣, area
求值為向量,並且只要最終結果的長度與輸入的長度相同,就可以進行各種R操作。
此處的例外情況是,先前的group_by
更改,以便按數據的well
值將數據分為多個塊, well
對每個組一次評估mutate表達式,而不是一次對整個數據幀求值。 這樣可以使子集的區域( area[1]
)的子集獲得每個組中的第一個區域,並且arrange
調用確保第一個區域將是時間為零的區域。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.