R中的子集数据框
subsetting data frame in R
我有一个这样的数据框:
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
第一行是header。我想过滤这个数据框,这样我就得到了那些行,其中至少有 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
我该怎么做?
谢谢
考虑你的 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]>30
测试哪些数值列的值大于 30
rowSums(.)>= 3
表示哪些行符合您的条件:至少有 3 列的计数均 > 30
DF[rowSelect, ]
选择您要求的那些行
假设您的数据名为 dat
,您可以像这样获得所需的行(假设 GENE
具有行名称,而不是实际的列):
dat[apply(dat, 1, function(x) sum(x > 30) >= 3), ]
如果 GENE
是数据框的实际列(并且是第一列),您可以使用 dat[, -1]
而不是 dat
在行选择中:
dat[apply(dat[, -1], function(x) sum(x > 30) >= 3), ]
我有一个这样的数据框:
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
第一行是header。我想过滤这个数据框,这样我就得到了那些行,其中至少有 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
我该怎么做?
谢谢
考虑你的 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]>30
测试哪些数值列的值大于 30
rowSums(.)>= 3
表示哪些行符合您的条件:至少有 3 列的计数均 > 30
DF[rowSelect, ]
选择您要求的那些行
假设您的数据名为 dat
,您可以像这样获得所需的行(假设 GENE
具有行名称,而不是实际的列):
dat[apply(dat, 1, function(x) sum(x > 30) >= 3), ]
如果 GENE
是数据框的实际列(并且是第一列),您可以使用 dat[, -1]
而不是 dat
在行选择中:
dat[apply(dat[, -1], function(x) sum(x > 30) >= 3), ]