【问题标题】:subsetting data frame in R [duplicate]R中的子集数据框[重复]
【发布时间】:2019-05-06 21:52:37
【问题描述】:

我有一个这样的数据框:

GENE    a1  a2  a3  b1  b2  b3
G1  862 817 923 1096    997 946
G2  443 410 421 448 417 388
G3  396 348 372 428 351 361
G4  350 319 310 394 295 311
G5  350 332 341 412 303 316
G6  377 369 397 462 330 351
G7  362 348 399 437 378 376
G8  332 312 398 387 372 332
G9  511 473 564 496 533 441
G10 42  54  48  24  19  17
G11 346 308 343 279 349 259
G12 273 255 265 199 270 206
G13 26  19  18  14  19  19
G14 17  9   10  8   9   11
G15 12  8   6   9   5   21

第一行是标题。我想过滤这个数据框,以便最终得到那些行,其中至少 3 列的计数 > 30

我做了这样的事情

data <- read.table("test.txt",header=TRUE,sep="\t",row.names=1)
data <- data[rowSums(data) > 30,]

但这会将第 1 列到第 6 列相加,看看总和是否 >30。我想为每列 > 30 做,然后在这些列中,3 个或更多列的计数为 30。所以我的数据框的输出应该是

GENE    a1  a2  a3  b1  b2  b3
G1  862 817 923 1096    997 946
G2  443 410 421 448 417 388
G3  396 348 372 428 351 361
G4  350 319 310 394 295 311
G5  350 332 341 412 303 316
G6  377 369 397 462 330 351
G7  362 348 399 437 378 376
G8  332 312 398 387 372 332
G9  511 473 564 496 533 441
G10 42  54  48  24  19  17
G11 346 308 343 279 349 259
G12 273 255 265 199 270 206

我该怎么做?

谢谢

【问题讨论】:

    标签: r subset rowsum


    【解决方案1】:

    考虑你的data.frame是DF

    > rowSelect <- rowSums(DF[,-1]>30)>= 3
    > DF[rowSelect, ]
       GENE  a1  a2  a3   b1  b2  b3
    1    G1 862 817 923 1096 997 946
    2    G2 443 410 421  448 417 388
    3    G3 396 348 372  428 351 361
    4    G4 350 319 310  394 295 311
    5    G5 350 332 341  412 303 316
    6    G6 377 369 397  462 330 351
    7    G7 362 348 399  437 378 376
    8    G8 332 312 398  387 372 332
    9    G9 511 473 564  496 533 441
    10  G10  42  54  48   24  19  17
    11  G11 346 308 343  279 349 259
    12  G12 273 255 265  199 270 206
    

    一点解释:

    DF[,-1]&gt;30 测试哪些数值列的值大于 30

    rowSums(.)&gt;= 3 表示哪些行满足您的条件:至少 3 个列的计数 > 30 个

    DF[rowSelect, ] 选择您要求的那些行

    【讨论】:

    • 不错,不知道DF[,-1]
    【解决方案2】:

    假设您的数据名为dat,您可以像这样获得所需的行(假设GENE 具有行名称,而不是实际列):

    dat[apply(dat, 1, function(x) sum(x > 30) >= 3), ]
    

    如果GENE 是数据框的实际列(并且是第一列),您可以通过在行选择中使用dat[, -1] 而不是dat 安全地将其从apply 计算中删除:

    dat[apply(dat[, -1], function(x) sum(x > 30) >= 3), ]
    

    【讨论】:

      猜你喜欢
      • 2015-10-04
      • 2016-04-20
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2012-05-26
      相关资源
      最近更新 更多