根据行值过滤/拆分3组中的数据帧

时间:2011-08-07 17:24:20

标签: r filter matrix split dataframe

我不确定标题是否清晰。 我有一个数据框(见下文),其中包含5列的值。我想要做的是将这个数据帧“拆分”为三个类,其中行可以分配为“高”,“中”,“低”状态。

我的意思是:

高:至少3列中的值“高”

中:值至少为3列中的“中等”

低:至少3列中的值为“低”(或NA

我想这涉及两件事,定义3组的价值截止,然后将行分为高,中,低类别......但这就是猜测

数据文件为available here

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(): 我有很多0,值很安静,所以使用logasinh,你就可以摆脱它。

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

另一种方法是使用Quantiles,正如我所见。

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 个答案:

答案 0 :(得分:2)

假设您希望通过不计算NA来处理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)) 而不是抛弃整行:

> 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

返回data.frame,如下所示:

{{1}}