我有一个这样的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_idweeks值,而不是同时复制这两列.

我对代码的 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 在我的代码中有不同的版本,但是到目前为止它们都没有成功.

问题:

  • 有没有可以同时计算列和连续行的函数?
  • 我能用我目前的替代方案做些什么?

推荐答案

interaction(lab_id, weeks)的基础上用by来拆分数据,计算colMeans,rbind.

> by(dat, with(dat, interaction(lab_id, weeks)), \(.) {
+   if (nrow(.) > 1) {
+     data.frame(.[1, 1:2], t(colMeans(.[-(1:2)])))
+   } else .
+ }) |> c(make.row.names=FALSE) |> do.call(what='rbind')
  lab_id          weeks GM.CSF   IFNa2     IFNg   IL10 IL12p40
1    op1 2020_G4_week_1 1.6900 13.0258  5.07550 3.3068     1.3
2    op1 2020_G4_week_4 1.6900  4.4113  3.95920 2.0100     1.3
3   op10 2020_G4_week_4 2.8418 13.3152 27.15075 2.0100     1.3

Data:

> dput(dat)
structure(list(lab_id = c("op1", "op1", "op10", "op10"), weeks = c("2020_G4_week_1", 
"2020_G4_week_4", "2020_G4_week_4", "2020_G4_week_4"), GM.CSF = c(1.69, 
1.69, 2.4236, 3.26), IFNa2 = c(13.0258, 4.4113, 8.3186, 18.3118
), IFNg = c(5.0755, 3.9592, 41.7559, 12.5456), IL10 = c(3.3068, 
2.01, 2.01, 2.01), IL12p40 = c(1.3, 1.3, 1.3, 1.3)), class = "data.frame", row.names = c("1", 
"2", "3", "4"))

R相关问答推荐

用单个表达匹配多个替代模式

变量计算按R中的行更改

使用ggplot 2根据R中的类别排列Likert比例gplot

从嵌套列表中智能提取线性模型系数

如何直接从Fortran到R的数组大小?

使用整齐的计算(curl -curl )和杂音

使用data.table::fcase()而不是dplyr::case_When()时保持值

哪一行和行和 Select 特定行,但是考虑到Nas

将一个字符串向量调整为与其他字符串向量完全相同的大小

以字符格式导入的ExcelElectron 表格日期列标题

安全地测试文件是否通过R打开

基于数据集属性将科分配给物种

在数据帧列表上绘制GGPUP

如何将一个方阵分解成没有循环的立方体

有没有办法将基于每个值中出现的两个关键字或短语的字符串向量重新编码为具有这两个值的新向量?

自定义交互作用图的标签

如何将图例文本添加到图例符号中

有没有办法更改ggplot2中第二个y轴的比例限制?

使用一个标签共享多个组图图例符号

从字符串01JAN2021创建日期