#r
#r
Вопрос:
предположим, что возникла следующая ситуация:
Statistic1 Condition1 Statistic2 Condition2 0.00001 Y 0.02 NA 0.03 Y 0.0001 NA 0.01 NA 0.001 Y ..............
В общей сложности 20 000 строк и 60 столбцов.
Предположим, вы хотите заменить в столбце «Условие *» NA / Y на 0
если значение в столбце относительной статистики* равно <0,05. Проверка будет
включить статистику парных столбцов *-Условие *.
Как это возможно сделать для большого количества столбцов и строк?
Заранее благодарю вас
B
Ответ №1:
Одной 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 всем столбцам «Условия» и создает идентификатор строки. Во-вторых, он выполняет преобразование широких данных в длинные, исключая идентификатор строки. В-третьих, он упорядочивает данные в соответствии с идентификатором строки и группирует по идентификатору строки и паре, которая состоит из числа в столбцах. Далее, проверяется, является ли статистика меньше 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)
Ответ №2:
Вы создаете логическое значение для каждого столбца, а затем пишете и (amp;) между ними. Вот простой пример, в котором я проверяю, соответствуют ли два столбца условию, что числа в обоих столбцах должны быть больше трех.
# Creating data
df <- data.frame(a = c(1,2,3,4), b = c(2,2,3,2))
# Running conditions on both columns and storing results in a new column
df$c <- df$a>2 amp; df$b>2
Если вы хотите произвести замены в одном столбце на основе другого столбца, вы можете сделать следующее.
# Creating data
df <- data.frame(a = c(1,2,3,4), b = c(2,2,3,2))
# If column a is above 2 column b is set to zero
df$b[df$a>2] <- 0
В будущем, пожалуйста, предоставьте примеры данных и выходных данных, чтобы мы могли помочь.