【发布时间】:2011-10-21 21:53:26
【问题描述】:
我不确定标题是否足够清楚。 我有一个数据框(见下文),其中包含 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,而且值很安静,所以通过使用 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
【问题讨论】:
-
您想要生成 3 个单独的 data.frames 吗?还是只想添加另一列分配给低、中或高?
-
你应该避免使用
t作为变量名,因为它是一个内部函数(转置矩阵)。 -
任何一种方式都可以——我想最方便的方法是增加一个带有 (H, M, L) 或类似内容的列
-
如果根据各个列的值将这 5 列分成三分位数,您将得到一堆没有指定类别的 H H M L L 或 M M H H L 或 NA NA M H H 行。你想丢弃它们吗?
-
有未定义的情况。当连续出现 2 个高点、1 个中点和 2 个低点时,你会怎么做?它被归类为什么?
标签: r filter matrix split dataframe