在R

时间:2018-01-25 17:09:59

标签: 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
...

“well”是样本id,“time”是实验期间的时间,“area”是我要测量的对象的区域。我想确定,对于每个时间点(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 row 6(也是时间0处的区域)。我正在尝试编写一个脚本来遵循这种模式,直到我的数据集结束,这将是大约500行。希望这是有道理的。

我知道一些基本的软件包(dplyr,tidyr,reshape2等),但我不知道如何做到这一点。我已经尝试了几种解决这个问题的方法,但是我对R完全不熟悉。是否有人可以帮助解决这个问题,或者至少指导我一些可能有用的文档?我不确定当数据是格式时我是否可以做我想做的事情,或者如果我需要重新格式化数据帧,进行我的计算,然后将其转换回原始格式以便在ggplot2中进行绘图。非常感谢!

2 个答案:

答案 0 :(得分:1)

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)

答案 1 :(得分:0)

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表达式中发生的事情。 area计算向量就像df$area在正常上下文中所做的那样,只要最终结果与输入的长度相同,就可以进行各种R操作。

此处的例外情况是前一个group_by对其进行了更改,以便将数据按其well值拆分为块,并且对每个组而不是整个数据计算一次mutate表达式一次全部框架。这使得对第一个区域项(area[1])的子集获得每个组中的第一个区域,并且arrange调用确保第一个区域将是时间零的区域。