Создание столбца ранжирования на основе значений в двух других столбцах с помощью функций mutate и min_rank - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь вернуться к некоторому более старому коду, в котором я использовал a для l oop для расчета комбинированного ранжирования генов на основе двух столбцов. Моя конечная цель - получить столбец, в котором указана доля генов, с которыми любой конкретный ген в наборе данных работает лучше, чем.

У меня есть data.frame, который я называю оценками, который содержит два столбца соответствующих баллы по моим генам. Чтобы вычислить комбинированный рейтинг, я использую следующее для l oop и вычисляю пропорциональную оценку путем деления полученного ранга на общее количество наблюдений.

scores <- data.frame(x = c(0.128, 0.279, 0.501, 0.755, 0.613), y = c(1.49, 1.43, 0.744, 0.647, 0.380))

#Calculate ranking
comb.score = matrix(0, nrow = nrow(scores), ncol = 1)
for(i in 1:nrow(scores)){
  comb.score[i] = length(which(scores[ , 1] < scores[i, 1] & scores[ , 2] < scores[i, 2]))
}

comb.score <- comb.score/length(comb.score) #Calculate proportion 

Теперь, когда я стал более знакомым и удобно с tidyverse. Я хочу преобразовать этот код для использования функций tidyverse, но я не смог разобраться в этом самостоятельно или с ответами сообщества SO или RStudio.

Я имел в виду идею использовать mutate() вместе с min_rank(), но я не совсем уверен в синтаксисе. Кроме того, поведение min_rank(), по-видимому, оценивает рейтинг с помощью логического теста, такого как scores[ , 1] <= scores[i, 1], в отличие от простого использования <, как я делал в моем первоначальном тесте. </p>

Мой ожидаемый результат - это дополнительный столбец в таблице scores, который имеет тот же результат, что и результат comb.score в приведенном выше коде: оценка, которая сообщает мне долю генов во всем наборе данных, которые ген в данной строке работает лучше, чем.

Любая помощь будет принята с благодарностью! Если мне нужно что-то уточнить или добавить дополнительную информацию, дайте мне знать!

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Немного похож на ответ Мартинса, но вместо него используется pmap.

library(tidyverse)

scores <- data.frame(
    x = c(0.128, 0.279, 0.501, 0.755, 0.613), 
    y = c(1.49, 1.43, 0.744, 0.647, 0.380)
)

scores %>% 
  mutate(
    score = pmap(list(x, y), ~ sum(..1 > x & ..2 > y)) / n()
  )
#>       x     y score
#> 1 0.128 1.490     0
#> 2 0.279 1.430     0
#> 3 0.501 0.744     0
#> 4 0.755 0.647   0.2
#> 5 0.613 0.380     0

Создано 18.06.2020 с помощью пакета (v0.3.0 )

3 голосов
/ 18 июня 2020

Интересный вопрос. Я предлагаю такой способ:

scores %>%
  rowwise() %>%
  mutate(comb_score = sum(x > .$x & y > .$y)) %>%
  ungroup() %>%
  mutate(comb_score = comb_score/n())

, что дает

# A tibble: 5 x 3
      x     y comb_score
  <dbl> <dbl>      <dbl>
1 0.128 1.49         0  
2 0.279 1.43         0  
3 0.501 0.744        0  
4 0.755 0.647        0.2
5 0.613 0.38         0 
...