我有一个广泛的数据集,包含大约150个生物标志物的300列--每个生物标志物都有一个基线值和一个最终值。我需要为每个生物标志物创建一个变化变量(最终-基线)。当我有10个变量时,我一直在手动地这样做,但我希望有一个更自动化的解决方案。这就是我目前正在做的事情:
df$marker1_chg = df$marker1_final - df$marker1_bl
df$marker2_chg = df$marker2_final - df$marker2_bl下面是一个示例数据集:
data <- data.frame(c(1, 2, 3, 4, 5),
c(2, 2.3, 3.4, 3.6, 4.1),
c(3.1, 4.3, 4.4, 2.3, 4.6),
c(2.2, 5.4, 6.9, 3.9, 2.1),
c(3.5, 4.1, 6.7, 5.4, 3.8))
colnames(data) <- c('id', 'marker1_bl', 'marker1_final', 'marker2_bl', 'marker2_final')发布于 2022-07-20 19:32:01
另一种可能的解决办法是:
library(tidyverse)
map2_dfc(select(data, ends_with("_final")) %>% relocate(order(names(.))),
select(data, ends_with("_bl")) %>% relocate(order(names(.))),
~ .x - .y) %>%
set_names(str_replace(names(.), "final", "chg")) %>%
bind_cols(data, .)
#> id marker1_bl marker1_final marker2_bl marker2_final marker1_chg marker2_chg
#> 1 1 2.0 3.1 2.2 3.5 1.1 1.3
#> 2 2 2.3 4.3 5.4 4.1 2.0 -1.3
#> 3 3 3.4 4.4 6.9 6.7 1.0 -0.2
#> 4 4 3.6 2.3 3.9 5.4 -1.3 1.5
#> 5 5 4.1 4.6 2.1 3.8 0.5 1.7发布于 2022-07-20 18:29:04
尝尝这个
lst <- list()
for(i in 1:150){
lst[[i]] <- data[[paste0("marker" , i , "_final")]] - data[[paste0("marker" , i , "_bl")]]
}
names(lst) <- paste0("marker" , 1:150 , "_ch")
ans <- data.frame(lst)https://stackoverflow.com/questions/73056423
复制相似问题