r语言 - 如何使所有以字符串开始的列减去所有以字符串结束的列?



如何使所有以字符串开始的列减去所有以字符串结束的列?我需要每列A.test, B.test, C.test减去A.control, B.control, C.control。我需要做的是不使用dplyr的是mutate(dA=A.test-A.control, dB=B.test-B.control, dC=C.test-C.control)。看起来acrossend_with只允许您操作一个后缀,而不是将两个后缀混合在一起。所以我不确定是否有一个整洁的方法来做到这一点使用dplyr

df %>%
select(sort(names(.))) %>%
mutate(across(contains('test'),  .names = 'd{substr(.col, 1, 1)}') - 
across(contains('control')))

你也可以考虑这样做:

df %>%
rownames_to_column('rn') %>%
pivot_longer(-rn, names_to = c('name', '.value'), names_sep = '[.]') %>%
mutate(d = test - control)%>%
pivot_wider(rn, values_from = c(test, control, d), names_sep = '') %>%
rename_with(~sub('(control|test)(.)', "\2.\1", .), matches('control|test'))

可以根据第一个列名构造第二个列名:

library(dplyr)
dat %>% 
mutate(across(ends_with("test"), 
~.x - get(gsub("test", "control", cur_column())),
.names = "{gsub('test', 'diff', .col)}"))

这返回

A.test B.test A.control B.control A.diff B.diff
1      1      3         1         2      0      1
2      2      4         1         2      1      2

借来的r2evans数据:

dat <- data.frame(A.test=1:2, B.test=3:4, A.control=c(1,1), B.control=c(2,2))

相关内容

  • 没有找到相关文章

最新更新