2

変数のデータセットがあります

Year    Age Bag Computer
2008    0   4   4
2008    1   5   3
2008    2   5   12.5
2008    3   5   15
2008    4   5   33
2008    5   5   11
2008    85  5   3.5
2008    .   .   .
2008    108 0   0
2008    109 0   0
2008    110+    0   0

データベースのゼロをすべて削除してこの最終テーブルを取得するには、R でこれをサブセット化する必要があります

Year    Age Bag Computer
2008    0   4   4
2008    1   5   3
2008    2   5   12.5
2008    3   5   15
2008    4   5   33
2008    5   5   11
2008    7   5   14.5
2008    8   5       17

高齢者にはゼロなし。

4

4 に答える 4

2

Bag または Computer の列に 0 が表示される行を特定する場合 (データフレームの名前が であると仮定するとdat、次を使用します。

bad.rows <- which(dat$Bag==0 | dat$Computer==0)

次のようにサブセット化できます。

subset(dat, !rownames(dat) %in% bad.rows)

または、行を識別するステップをスキップして、サブセットを使用することもできます。

subset(dat, Bag!=0 & Computer!=0)

等式の否定は、「&」の使用に切り替える必要があるかもしれないことを意味することに注意してください (または、おそらくそれはあなたが望んでいたものではありませんでした)。両方がゼロの場合にのみそれらを削除するか、特定の年齢を超えるすべてのゼロを持つ年齢を削除したい可能性があります。

subset(dat, !(Bag==0 & Computer==0) ) #  ages with any non-zero
于 2013-06-28T14:04:55.260 に答える
1

別の方法:

df[with(df, complete.cases(cbind(Bag, Computer)/0)), ]

より大きなデータのベンチマーク:

set.seed(45)
sz <- 1e6
df <- data.frame(Year=sample(1930:2013, sz, replace=TRUE), 
                 Age=sample(100, sz, replace=TRUE), 
                 Bag = sample(0:5, sz, TRUE), 
                 Computer=sample(0:10, sz, TRUE))

simon <- function(dt) {
    idx <- apply( dt , 1 , function(x) any( x[-2] == 0 ) )
    dt[ !idx , ]
}

dwin_konrad <- function(dt) {
    subset(dt, Bag != 0 & Computer != 0)
}

arun <- function(dt) {
    dt[with(dt, complete.cases(cbind(Bag, Computer)/0)), ]
}

require(microbenchmark)
microbenchmark(o1 <- simon(df), o2 <- dwin_konrad(df), o3 <- arun(df), times=5)

Unit: milliseconds
                  expr        min         lq     median         uq        max neval
       o1 <- simon(df) 15971.7720 16348.4055 16540.6794 18153.9090 18443.5480     5
 o2 <- dwin_konrad(df)   402.7010   419.3139   494.9592   723.1468   745.5400     5
        o3 <- arun(df)   320.8689   324.0388   334.0515   335.8886   366.6647     5

identical(o1, o2) # TRUE
identical(o1, o3) # TRUE
于 2013-06-28T17:48:03.970 に答える
1

行が削除されるany以外の列にゼロがある場合にサブセット化したいようです。行を実行し、論理比較を使用して、値 (年齢を除く) が等しいかどうかをAge確認します。applyany0df

#  Return a logical vector. TRUE if any value in row == 0
#  x[-2] removes the df$Age column from comparison
idx <- apply( df , 1 , function(x) any( x[-2] == 0 ) )

#  Use this to subset
df[ !idx , ]
#  Year Age Bag Computer
#1 2008   0   4      4.0
#2 2008   1   5      3.0
#3 2008   2   5     12.5
#4 2008   3   5     15.0
#5 2008   4   5     33.0
#6 2008   5   5     11.0
#7 2008  85   5      3.5

編集

@Arunは私が遅いと不平を言ったので(私はそうでしたが、テストする列がたくさんあるデータフレームまたはマトリックスを簡単に貼り付けることができる便利なコードを探していました)、標準的な(そして最速の!)方法をスローしますこれをサブセット化すると、次のようになります。

df[ df$Bag == 0 | df$Computer == 0 , ]

とにかく@Konradが与えた答えで暗黙のうちにカバーされていました。

于 2013-06-28T14:04:17.983 に答える