首先,请原谅我对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中进行绘图。非常感谢!
答案 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
调用确保第一个区域将是时间零的区域。