对于标题模糊的问题,我感到抱歉,由于我无法想到简洁的问题名称,我可能错过了已经存在的答案。如果有人有标题建议,我很乐意编辑!
(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 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
我知道这是可能的,我认为我的主要问题是我无法正确搜索该问题!
答案 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))