我有一个这样的df(简化版本):
lab_id weeks GM.CSF IFNa2 IFNg IL10 IL12p40
1 op1 2020 G4 week_1 1.6900 13.0258 5.0755 3.3068 1.3
2 op1 2020 G4 week_4 1.6900 4.4113 3.9592 2.0100 1.3
3 op10 2020 G4 week_4 2.4236 8.3186 41.7559 2.0100 1.3
4 op10 2020 G4 week_4 3.2600 18.3118 12.5456 2.0100 1.3
我正在try 判断连续的行,并在两列中满足特定条件.
第lab_id
列有重复的字符串,但是,如果你看一下第weeks
列,你可以有不同的值,在我的例子中只出现week_1 and 4
,但我也有2 and 3
.
所以,条件是:
- 如果列
lab_id
在两个连续行中具有相同的值; - 计算
weeks
列中的字符串,如果星期不同,则不执行任何操作; - 如果两个连续行中
weeks
列的字符串相同,则执行以下操作; - 从连续的两行计算数值的平均值;
- 然后将新行的行替换为平均计算值;
例如,在第1行和第2行,我有:
op1 2020 G4 week_1
op1 2020 G4 week_4
代码不需要做任何事情,但是,对于第3行和第4行,我有:
op10 2020 G4 week_4
op10 2020 G4 week_4
因此,在本例中,我需要计算满足上述条件的两个连续行之间的平均值GM.CSF IFNa2 IFNg IL10 IL12p40
.
对于第3行和第4行,我的预期结果必须为:
lab_id weeks GM.CSF IFNa2 ...
3 op10 2020 G4 week_4 2.8418 13.3152 ...
正如您所看到的,新值是来自两个连续行的数字列的平均值,现在我只有一个行,其中包含唯一的lab_id
和weeks
值,而不是同时复制这两列.
我对代码的 idea 是使用rowise()
函数和if_else
语句.
test %>%
rowwise() %>%
mutate(result = eval(parse(string = condition)))
但是,我认为这不是正确的方法,因为我正在计算两列中具有特定字符串值的两个连续行,因此mutate()
可能是更好的替代方法.
mutate()
运行前判断条件的功能:
test %>%
mutate(duplicated_w = duplicated(lab_id) & weeks == "week_4")
因此,如果条件为TRUE
,则从列中的值执行mean()
,
但是,此条件未正确计算,因为在条件不满足条件的行中返回TRUE
.
这两个 idea 在我的代码中有不同的版本,但是到目前为止它们都没有成功.
问题:
- 有没有可以同时计算列和连续行的函数?
- 我能用我目前的替代方案做些什么?