Одна tidyverse
возможность может быть:
df %>%
mutate_at(vars(matches("Condition")), list(~ (. = 1))) %>%
rowid_to_column() %>%
gather(var, val, -rowid) %>%
arrange(rowid) %>%
group_by(rowid, pair = parse_number(var)) %>%
mutate(val = (lag(val, default = 0) < 0.05) * val) %>%
ungroup() %>%
select(-pair) %>%
spread(var, val) %>%
select(-rowid)
Condition1 Condition2 Statistic1 Statistic2
<dbl> <dbl> <dbl> <dbl>
1 1 0 0.00001 1
2 1 1 0.03 0.0001
3 1 1 0.01 0.001
Здесь он, во-первых, присваивает 1 всем столбцам «Condition» и создает идентификатор строки. Во-вторых, он выполняет преобразование данных из широких в длинные, исключая идентификатор строки. В-третьих, он упорядочивает данные по идентификатору строки и группирует по идентификатору строки и паре, которая состоит из числа в столбцах. В-четвертых, он проверяет, является ли статистика менее 0,05. Наконец, он возвращает данные в исходный формат и удаляет избыточные переменные.
Я использовал этот пример данных, где я добавил один случай, когда статистика равна 1:
df <- read.table(text = "Statistic1 Condition1 Statistic2 Condition2
0.00001 Y 1 NA
0.03 Y 0.0001 NA
0.01 NA 0.001 Y",
header = TRUE,
stringsAsFactors = FALSE)