Фильтровать / разбить фрейм данных на 3 группы в соответствии со значениями строк - PullRequest
1 голос
/ 07 августа 2011

Я не уверен, что название достаточно ясно.У меня есть датафрейм (см. Ниже), который содержит значения в 5 столбцах.Я хотел бы «разбить» этот фрейм данных на три класса, где строки могут быть назначены в состояние «High», «Medium», «Low».

Что я имею в виду:

Высокий: значения «высокие» как минимум в 3 столбцах

Средний: значения «средний» как минимум в 3 столбцах

Низкий: значения «Низкие»(или NA) как минимум в 3 столбцах

Я предполагаю, что это включает в себя две вещи: определение значения отсечения для 3 групп, затем распределение строк по категориям High, Medium и Low ... но это предположение

Файл данных доступен здесь

tmp = read.table("tmp2.txt", header=TRUE)
head(tmp)
           Geneid     Hsap      Mmul      Mmus      Rnor     Cfam
1 ENSG00000197711 365823.5 243429.20 44337.267 156874.50 128015.0
2 ENSG00000198712 198613.0        NA 47767.767 200176.50 210559.8
3 ENSG00000198899 189421.5        NA        NA 283425.50 367112.8
4 ENSG00000198804 182559.5        NA 87301.900 277861.00 324438.0
5 ENSG00000198840 142424.5        NA  8400.457  45844.80 115027.9
6 ENSG00000171564 119147.9  93564.66  6675.290  45938.85  45140.2

Любые советы очень ценятся, поскольку у меня нет ни малейшего представления о том, как с этим справиться!

Спасибо,


Ответ ниже:

Теперь я заменил файл более реалистичным (больше строк)

tbl <- read.csv("http://db.tt/L2ehGh8", header=FALSE)
colnames(tbl) <- c("Geneid","Hsap","Mmul","Mmus","Rnor","Cfam")

Использование cut(): у меня много нулей, а значения растягиваются тихо, поэтому с помощью log или здесь asinh вы избавитесь от этого.

tbl.data <- apply(asinh(tbl.data),2,
                  function(x) as.numeric(as.factor(cut(x,4)))  )
head(tbl.data)
     Hsap Mmul Mmus Rnor Cfam
[1,]    2    2    1    1    2
[2,]    2    2    2    2    2
[3,]    1    1    1    1    1
[4,]    1    1    1    1    1
[5,]    2    3    2    2    3
[6,]    2    2    2    2    2

Другой способ - использовать квантили, которые, как мне показывали,

quantile(tbl.data[,1],0.25)
quantile(tbl.data[,1],0.5)
quantile(tbl.data[,1],0.75)

tbl.data2 <- apply(tbl.data,2,
                   function(x) as.numeric(as.factor(cut(x,c(-1,
                       quantile(x, 0.25)+0.0001,
                       quantile(x,0.5),
                       quantile(x,0.75), max(x))))))
head(tbl.data2)
     Hsap Mmul Mmus Rnor Cfam
[1,]    3    3    3    2    3
[2,]    2    3    4    3    3
[3,]    2    1    1    1    2
[4,]    1    2    1    1    1
[5,]    4    4    4    4    4
[6,]    3    4    4    3    4

1 Ответ

2 голосов
/ 07 августа 2011

Предполагая, что вы хотите обработать NA s, не считая их, а не бросая всю строку:

tbl <- read.table("http://db.tt/Eb6qM4h",header=TRUE)
tbl.data <- subset(tbl,select=-Geneid)
tbl.data <- apply(tbl.data,2,function(x) as.numeric(as.factor(cut(x,3)))  )


countLevels <- function(tbl.data,lvl) {
  apply(tbl.data,1,function(x) sum( x[!is.na(x)] == lvl ) )
}

tbl.final <- tbl.new <- subset(tbl,select=Geneid)
for(lvl in seq(3) ) {
  tbl.new[,paste('Level',lvl)] <- (countLevels(tbl.data,lvl) > 3) * lvl
}

tbl.final$Levels <- rowSums(subset(tbl.new,select=-Geneid))

Что возвращает data.frame следующим образом:

> head(tbl.final,20)
            Geneid Levels
1  ENSG00000197711      0
2  ENSG00000198712      0
3  ENSG00000198899      0
4  ENSG00000198804      0
5  ENSG00000198840      0
6  ENSG00000171564      1
7  ENSG00000171557      1
8  ENSG00000198727      1
9  ENSG00000163631      0
10 ENSG00000198888      1
11 ENSG00000198695      1
12 ENSG00000198763      1
13 ENSG00000198786      1
14 ENSG00000158874      0
15 ENSG00000138207      1
16 ENSG00000109072      1
17 ENSG00000130203      3
18 ENSG00000106927      1
19 ENSG00000110169      1
20 ENSG00000104760      1
...