删除与值匹配的行

时间:2014-07-27 19:14:19

标签: r dataframe match data-cleansing

我试图过滤掉一些数据。假设列包含一个数值,如果所有列中的等于零必须去。我虽然关于执行多个匹配,但是如此

match1 <- match(which(storm$FATALITIES==0), which(storm$INJURIES==0))
match2 <- match(which(storm$CROPDMG==0), which(storm$CROPDMGEXP==0))
match3 <- match(which(storm$PROPDMG==0), which(storm$PROPDMGEXP==0))
match4 <- match(match1, match2)
matchF <- match(match4, match3)

但它显然不起作用,因为它给出了最后一个向量的位置...... 数据看起来像这样:

             BGN_DATE STATE  EVTYPE FATALITIES INJURIES PROPDMG PROPDMGEXP CROPDMG
1   4/18/1950 0:00:00    AL TORNADO          0       15    25.0          K       3
2   4/18/1950 0:00:00    AL TORNADO          0        0     0.0          K       0
3   2/20/1951 0:00:00    AL TORNADO          0        2    25.0          K       0
4    6/8/1951 0:00:00    AL TORNADO          0        2     0.0          K       0
5  11/15/1951 0:00:00    AL TORNADO          0        0     0.0          K       0
6  11/15/1951 0:00:00    AL TORNADO          1        6     2.5          K       0
7  11/16/1951 0:00:00    AL TORNADO          0        1     2.5          K       0
   CROPDMGEXP LATITUDE LONGITUDE REFNUM
1                 3040      8812      1
2                 3042      8755      2
3                 3340      8742      3
4                 3458      8626      4
5                 3412      8642      5
6                 3450      8748      6
7                 3405      8631      7

我有兴趣匹配删除所有0为INJURIES,FATALITIES,CROPDMG,PROPDMG的条目(所有条目同时)。我已经用complete.cases()过滤了NA。 感谢

1 个答案:

答案 0 :(得分:3)

以下是几种方法。一个互动且非常直观的:

subset(storm, INJURIES   != 0 |
              FATALITIES != 0 |
              CROPDMG    != 0 |
              PROPDMG    != 0)

和一个程序化,因此更灵活/可扩展:

fields <- c('INJURIES', 'FATALITIES', 'CROPDMG', 'PROPDMG')
keep   <- rowSums(storm[fields] != 0) > 0
storm[keep, ]
相关问题