我有这样的数据(约1000行):
head(data)
alt alb alp alt_zscore alb_zscore alp_zscore
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 11 2.60 9 -1.54 -7.82 -0.949
2 12 5.37 86.3 -1.45 -0.351 2.31
3 15.7 4.67 28 -1.09 -2.24 -0.148
4 7 4.43 171. -1.93 -2.89 5.87
5 14.5 3.75 12 -1.20 -4.72 -0.822
6 17.5 3.70 82.5 -0.915 -4.86 2.15
每个变量列(即
alt
,alb
,alp
)都有一个相应的z分数列(alt_zscore
,alb_zscore
,alp_zscore
)。在我的之前的代码中,我告诉R,对于每个z分数列,如果观察值比平均值低1个标准差以上,就取z分数观察值的绝对值;如果不符合条件,则给它赋值为0。(我这样做的原因是因为在我的代码后面,我将所有这些z分数观察值相加到另一列中。)
以下是我的之前的代码:
name <- c("alt_zscore", "alb_zscore", "alp_zscore")
stdev <- 1
lf <- list(
\(x) ifelse(x <= -stdev, abs(x), 0),
\(x) ifelse(x <= -stdev, abs(x), 0),
\(x) ifelse(x <= -stdev, abs(x), 0)
) %>%
setNames(name)
我这样做的原因是为了创建一个名为“total_score”的新列,该列是符合我的条件的所有z分数的总和。
data <- data %>%
mutate(total_score = rowSums(across(all_of(name), ~ lf[[cur_column()]](.)), na.rm = TRUE))
现在,我要做的是告诉R,对于每个“常规”列(即,在这里我指的是'alt'而不是'alt_zscore'),如果一个观察值小于该列的第25百分位数,那么取其对应的z得分列(alt_zscore)的绝对值;否则,将其设为零。注意:有时我需要指定第75百分位数,或者第25或第75百分位数,所以希望代码在这方面是可调整的。
我正在尝试修改我的现有代码来实现这一点,但没有成功。任何帮助将不胜感激。谢谢!
alt
、alb
和alp
的标准是相同的,你可以在across()
内部修改if_else()
部分。例如:~ if_else(.x < quantile(.x, .25) | .x > quantile(.x, .75), abs(get(paste0(cur_column(), "_zscore"))), 0)
。 - Darren Tsaiacross(alt_zscore:alp_zscore, ...)
而不是across(alt:alp, ...)
。 - Darren Tsai