更改R中的列:根据另一个列条件从列中减去值

时间:2019-11-27 15:37:51

标签: r dplyr mutate

对于标题模糊的问题,我感到抱歉,由于我无法想到简洁的问题名称,我可能错过了已经存在的答案。如果有人有标题建议,我很乐意编辑!

(1)我有一个带有ID,值和一个基线列的数据框,该基线为空或Y(2)我想根据异常值过滤数据帧,然后用异常值创建一个表AND一列,可从每个ID的基线中减去该值。

set.seed(42)
test <- data.frame(id = c(rep("A", 5), rep("B", 5), rep("C", 5)),
                   values = rnorm(15, 1.5),
                   baseline = rep(c("Y", "", "", "", ""), 3))

数据帧:

三个唯一的ID,每个ID都有各自的基准值。

   id     values baseline
1   A  2.1359504        Y
2   A  1.2157471         
3   A -1.1564554         
4   A -0.9404669         
5   A  2.8201133         
6   B  1.1933614        Y
7   B -0.2813084         
8   B  1.3280826         
9   B  2.7146747         
10  B  3.3951935         
11  C  1.0695309        Y
12  C  1.2427306         
13  C -0.2631631         
14  C  1.9600974         
15  C  0.8600051         

电流输出

我没有在这里进行第三次新的改动

test %>% filter(values > (1.5*IQR(test$values)))

离群值的ID和值

id   values     baseline
A    2.820113         
B    2.714675         
B    3.395193 

所需的输出

每位患者,获取baseline == "Y"处的值,然后从值列中减去该值。

id   values    v-baseline
A    2.820113  0.6841626   #2.820113-2.1359504  values - A baseline       
B    2.714675  1.521314    #2.714675-1.1933614  values - B baseline
B    3.395193  2.201832    #3.395193-1.1933614  values - B baseline

我知道这是可能的,我认为我的主要问题是我无法正确搜索该问题!

1 个答案:

答案 0 :(得分:1)

您可以按id进行分组,然后针对每个id计算相对于基准值的值。对于离群值过滤,我选择了values小于总25%百分数或大于总75%百分数的行,这似乎正是您要达到的目标。但是,您当然可以对其进行调整以满足您的特定需求。

library(tidyverse)

test %>% 
  group_by(id) %>% 
  mutate(v_baseline = values - values[baseline=="Y"]) %>% 
  ungroup %>% 
  filter(values < quantile(values, probs=0.25) |
           values > quantile(values, probs=0.75))