如何使所有以字符串开始的列减去所有以字符串结束的列?我需要每列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)
。看起来across
和end_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))