Применить условие к парным столбцам - PullRequest
1 голос
/ 23 апреля 2019

предположим, что имеет место следующая ситуация:

    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.Проверка будет включать парные столбцы Statistic * -Condition *.Как можно сделать это для большого количества столбцов и строк? </p>

Заранее спасибо

B

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Одна 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)
0 голосов
/ 23 апреля 2019

Вы делаете boolen для каждого столбца, а затем пишете и (&) между ними.Вот простой пример, где я проверяю, соответствуют ли два столбца условию, что числа в обоих столбцах должны быть выше трех.

# 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 & 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

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

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