全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
1310 5
2020-01-30
以下数据框6行,10列,想批量求每行的20%、40%、60%、80%百分位数,再对每行数据重新赋值:<20%分位数的数据赋值为1,>=20% & <40%分位数的数据赋值为2,>=40% & <60%分位数的数据赋值为3,>=60% & <80%分位数的数据赋值为4,>=80%分位数的数据赋值为5,保留原来的行名与列名。请大神赐教,多谢!


dat.exp10
             TCGA.64.1678.01 TCGA.78.7540.01 TCGA.67.6217.01 TCGA.86.8672.01 TCGA.75.7027.01
hsa-let-7a-1       12.001275        14.19005       13.337726       12.734916       12.725947
hsa-let-7a-2       11.954795        14.18530       13.320367       12.737869       12.720863
hsa-let-7a-3       11.948878        14.19789       13.334454       12.745776       12.726436
hsa-let-7b         13.983441        15.35749       13.674048       13.385433       13.750861
hsa-let-7c         10.638759        10.10007       11.030242        9.691117        8.646320
hsa-let-7d          9.437125         9.33674        9.705212        8.171743        9.243464
             TCGA.55.5899.01 TCGA.35.5375.01 TCGA.38.7271.01 TCGA.44.7672.01 TCGA.44.3918.01
hsa-let-7a-1       12.855634       13.804513       14.581824       13.504605       11.060817
hsa-let-7a-2       12.851599       13.791944       14.581775       13.498497       11.051985
hsa-let-7a-3       12.870281       13.798391       14.578845       13.498305       11.078619
hsa-let-7b         12.781606       13.730736       14.549438       13.341988       12.717922
hsa-let-7c          9.881730       11.746155       12.046422        9.587829        9.517154
hsa-let-7d          8.418978        9.855121        8.876497        8.544340        8.497549
>

我已尝试用以下代码批量求得每行的20%、40%、60%、80%百分位数(原数据框名字为dat.exp10),
quantile5 <- function(x) quantile(x, probs=c(.2,.4,.6,.8))
dat.exp11 <- apply(dat.exp10, 1, quantile5)

dat.exp11
    hsa-let-7a-1 hsa-let-7a-2 hsa-let-7a-3 hsa-let-7b hsa-let-7c hsa-let-7d
20%     12.58101     12.56765     12.57092   13.22991   9.573694   8.481835
40%     12.80735     12.80611     12.82048   13.55860   9.805485   8.743634
60%     13.40448     13.39162     13.39999   13.73879  10.315546   9.280775
80%     13.88162     13.87061     13.87829   14.09664  11.173425   9.490743
>



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2020-1-30 21:54:11
quantile5 <- function(x) findInterval(x, quantile(x, probs=c(.2,.4,.6,.8)))
dat.exp11 <- apply(dat.exp10, 1, quantile5)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2020-1-30 22:08:50
quantile5 <- function(x) findInterval(x, quantile(x, probs=c(.2,.4,.6,.8)))
dat.exp11 <- apply(dat.exp10, 1, quantile5)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2020-1-31 11:30:54
cheetahfly 发表于 2020-1-30 21:54
quantile5
多谢大神指点,问题能解决。再进一步请教一下,如果想要结果为1、2、3、4、5(您的代码结果为0、1、2、3、4)该如何做?看了一下,通过改变findInterval函数的参数貌似不能解决这个问题。当然dat.exp11+1能解决这个问题,除此以外还有没有别的办法,多谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2020-1-31 14:27:34
quantile5 <- function(x) findInterval(x, quantile(x, probs=c(.2,.4,.6,.8))) + 1
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2020-1-31 20:41:29
cheetahfly 发表于 2020-1-31 14:27
quantile5
多谢大神,问题已完美解决。麻烦您再指点一下:
quantile5 <- function(x) quantile(x, probs=c(.2,.4,.6,.8))
dat.exp11 <- apply(dat.exp10, 1, quantile5)

用以上语句求出20%、40%、60%、80%百分位数后,我想用for循环语句+自编函数rankfun,配合apply函数实现批量赋值,但不成功,请您看一下,问题出在哪里,是引用格式不对还是其他问题,代码如何改?这里只有4行数据,手动输入了行索引值,[1,i],[2,i],[3,i],[4,i],若行数较多,怎么实现行、列的循环索引?万分感谢!

for (i in 1:ncol(dat.exp11))
  rankfun <- function(x)
  {
    x[x < dat.exp11[1,i]] <- "1"
    x[x >= dat.exp11[1,i] & x < dat.exp11[2,i]] <- "2"
    x[x >= dat.exp11[2,i] & x < dat.exp11[3,i]] <- "3"
    x[x >= dat.exp11[3,i] & x < dat.exp11[4,i]] <- "4"
    x[x >= dat.exp11[4,i]] <- "5"
  }

dat.exp12 <- apply(dat.exp10, 1, rankfun)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群