如果存在,删除缺勤数据?

时间:2013-07-12 14:06:18

标签: r sorting if-statement delete-row

我在R:

中有这样的数据集
ROW_NAMES   PRES_AB  LON       LAT    

56129606       1     -109.8236 44.11312
56129606       0     -109.8236 44.11312
56129607       1     -109.7474 44.10961
56129607       0     -109.7474 44.10961
56129608       0     -109.6709 44.12495
56129609       0     -109.6285 44.11815
56129610       0     -109.5649 44.11377
56129611       0     -109.4849 44.11273
56129611       1     -109.4849 44.11273

第1列是我为行指定的名称,这些行是怀俄明州的USDA图的名称,第2列是图中物种的存在/不存在数据,第3列是图的经度坐标,第4列是图的纬度坐标。

您可以看到前两行分配给同一图(PRES_AB=1)的状态(PRES_AB=0)和缺席(56129606)。第三行和第四行以及最后两行也是如此。我想删除PRES_AB=0 的行,如果存在该情节(如果已有PRES_AB=1)。我的数据应如下所示:

ROW_NAMES   PRES_AB  LON       LAT    

56129606       1     -109.8236 44.11312
56129607       1     -109.7474 44.10961
56129608       0     -109.6709 44.12495
56129609       0     -109.6285 44.11815
56129610       0     -109.5649 44.11377
56129611       1     -109.4849 44.11273

顺便说一下,这是一个81,000行的数据集,我只是展示了它的一部分。

3 个答案:

答案 0 :(得分:1)

假设您的数据位于数据框a中,那么这应该可以解决问题:

a[!(a$ROW_NAMES %in% a[a$PRES_AB==1,'ROW_NAMES'] & a$PRES_AB==0),]

答案 1 :(得分:0)

这可以使用子集和%in%函数来完成:

> test.data <- data.frame(cbind(ROW_NAMES=c("A", "A", "B", "C", "D", "D"), PRES_AB=c(1,0,1,0,1,0), OTHER_DATA=c("bla", "bla", "bla", "etc", "etc", "etc")))
> test.data
  ROW_NAMES PRES_AB OTHER_DATA
1         A       1        bla
2         A       0        bla
3         B       1        bla
4         C       0        etc
5         D       1        etc
6         D       0        etc


> test.data[!(test.data[,"ROW_NAMES"] %in% (test.data[test.data[,"PRES_AB"]==1, "ROW_NAMES"]) & (test.data[,"PRES_AB"]==0)),]

  ROW_NAMES PRES_AB OTHER_DATA
1         A       1        bla
3         B       1        bla
4         C       0        etc
5         D       1        etc

答案 2 :(得分:0)

我的答案分两步,因为通常我会通过逻辑来思考选择哪些行。

首先,我创建一个列,其中包含每个ROW_NAME的观察数量。

require(plyr)
# Add column with information on how many observations for each ROW_NAME
dat1 = ddply(dat1, .(ROW_NAMES), transform, numid = length(PRES_AB) )

一旦我掌握了这些信息,当PRES_AB为1时,我可以使用逻辑运算符仅提取少于2个观察值的ROW_NAMES或(如果超过1个观察值)。

# subset dataset with subset() (or use extract, "[")
   # remove extra column "numid" for neatness
subset(dat1, numid < 2 | PRES_AB == 1, -numid)