我在R:
中有以下矩阵(实际上是数据帧)> str(x2)
'data.frame': 274569 obs. of 15 variables:
$ ykod : int 99 99 99 99 99 99 99 99 99 99 ...
$ yad : Factor w/ 43 levels "BAKUGAN","BARBIE",..: 2 2 2 2 2 2 2 2 2 2 ...
$ per : Factor w/ 3 levels "2 AYLIK","3 AYLIK",..: 3 3 3 3 3 3 3 3 3 3 ...
$ donem: int 201106 201106 201106 201106 201106 201106 201106 201106 201106 201106 ...
$ sayi : int 201106 201106 201106 201106 201106 201106 201106 201106 201106 201106 ...
$ mkod : int 359 361 362 363 366 847 849 850 1505 1506 ...
$ mad : Factor w/ 11045 levels " Hilal Gida ",..: 5163 3833 10840 8284 10839 2633 10758 10293 6986 6984 ...
$ mtip : Factor w/ 30 levels "Abone Bürosu ",..: 20 20 20 20 20 2 2 2 11 11 ...
$ kanal: Factor w/ 2 levels "OB","SS": 2 2 2 2 2 2 2 2 1 1 ...
$ bkod : int 110006 110006 110006 110006 110006 110006 110006 110006 110006 110006 ...
$ bad : Factor w/ 213 levels "4. Levent","500 Evler",..: 25 25 25 25 25 25 25 25 25 25 ...
$ bolge: Factor w/ 12 levels "Adana Şehiriçi",..: 7 7 7 7 7 7 7 7 7 7 ...
$ sevk : int 5 2 2 2 10 0 4 3 13 32 ...
$ iade : int 0 2 1 2 4 0 3 2 0 8 ...
$ satis: int 5 0 1 0 6 0 1 1 13 24 ...
我想从这个主数据框创建子集。例如,我需要一个满足多个条件的子矩阵,例如
ykod = 123
和donem = 201109
以及sevk > 20
和satis > 10
。
我怎样才能做到这一点?
答案 0 :(得分:3)
x2[x2$ykod == 123 & x2$donem == 201109 & x2$sevk > 20 & x2$satis > 10,]
或者,为了缩短它:
with(x2, x2[ykod == 123 & donem == 201109 & sevk > 20 & satis > 10,])
或者,如果列附加到全局变量(使用attach(x2)
),则可以
写一下
x2[ykod == 123 & donem == 201109 & sevk > 20 & satis > 10,]
如果你只想要列ykod和yad:
x2[x2$ykod == 123 & x2$donem == 201109 & x2$sevk > 20 & x2$satis > 10, c('ykod', 'yad')]
如果你只想要前4列(我在这里缩短了条件):
x2[x2$ykod == 123, 1:4]
答案 1 :(得分:3)
如果像我一样,你使用SQL比R数据框更方便,你可以使用sqldf
:
require(sqldf)
x2_subset <- sqldf(
"SELECT * FROM x2
WHERE ykod = 123
AND donem = 201109
AND sevk > 20
AND satis > 10" )
作为奖励,大数据帧或复杂操作也应该更快。