Ваши данные:
set.seed(42)
df <- data.frame(
id=rep(1:5,each=2),
trt = rep(c("A","B","A","B", "B","A", "B","A","A","B"),),
value1 = sample(1:100,10),
value2 = sample(1:100,10),
value3 = sample(1:100,10),
stringsAsFactors = F)
Решение:
library(tidyr)
library(dplyr)
df %>%
gather(key, value, -trt, -id) %>%
mutate(value = if_else(trt == "B", -value, value)) %>%
group_by(id, key) %>%
summarise(value = sum(value)) %>%
ungroup() %>%
spread(key, value)
Дело здесь в том, чтобы сначала преобразовать с помощью gather
фрейм данных в длинную форму и поместить все ваше значение в одном столбце.
Видно, что значения с B должны быть вычтены, я установил значения с B как отрицательные.
В этот момент я свободен для некоторых всех значений id
и key
(что соответствует метке value1
, value2
, value3
).
Я могу вернуться к исходной конфигурации фрейма данных с одним столбцом на каждое «значение» с помощью spread
.
Неважно, сколько столбцов «valueN» у вас есть.