R: ранжировать данные отдельного столбца в большом кадре данных или матрице - PullRequest
0 голосов
/ 25 октября 2018

У меня есть большой файл данных пациента, который я хочу ранжировать на основе значений столбцов (без изменения порядка данных).Например

patient<-c("a", "b", "c", "d", "e","f")
gene1<-c(500, 490, 500, 750, 550, 500)
gene2<-c(200, 470, 1000, 50, 720, 1100)
x<-data.frame(patient,gene1,gene2)
x
  patient gene1 gene2
1       a   500   200
2       b   490   470
3       c   500  1000
4       d   750    50
5       e   550   720
6       f   500  1100

Я хочу получить что-то вроде этого ...

x
  patient gene1 gene2 
1       a     2     2
2       b     1     3
3       c     6     5
4       d     5     1
5       e     4     4
6       f     3     6

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

x <- read.csv("data.csv", row.names = "Patient")
order.scores<-order(x$gene1,x)
x$rank <- NA
x$rank[order.scores] <- 1:nrow(x)

Кто-нибудь может предложить подходящую функцию?Спасибо!

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Этот код позволит вам циклически проходить по столбцам

for (i in 2:length(colnames(x))) {
  x[,i] <- rank(x[,i])
}

и выдает следующий результат:

  patient gene1 gene2
1       a     3     2
2       b     1     3
3       c     3     5
4       d     6     1
5       e     5     4
6       f     3     6

Или

for (i in 2:length(colnames(x))) {
  x[,i] <- order(x[,i])
}

приводит к

  patient gene1 gene2
1       a     2     4
2       b     1     1
3       c     3     2
4       d     6     5
5       e     5     3
6       f     4     6
0 голосов
/ 25 октября 2018

Вот один из способов использования пакета dplyr.Это будет ранжировать все столбцы от 2-го до последнего, предполагая, что первый столбец всегда patient.

Также необходимо передать аргумент ties.method = "first" в rank, что означает, что связи прерываются в зависимости от того, какое значение появляется первым.

library(dplyr)

x %>% mutate_at(2:ncol(.), rank, ties.method = "first")

  patient gene1 gene2
1       a     2     2
2       b     1     3
3       c     3     5
4       d     6     1
5       e     5     4
6       f     4     6
0 голосов
/ 25 октября 2018

Попробуйте:

library(dplyr)
x %>% mutate_at(vars(starts_with("gene")), rank, ties.method = "first")
# or x %>% mutate_at(vars(contains("gene")), rank, ties.method = "first")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...