Применить условие к парным столбцам

#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
  

В будущем, пожалуйста, предоставьте примеры данных и выходных данных, чтобы мы могли помочь.