簡體   English   中英

在R中增量遍歷數據幀列n次

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM