1

我在 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 列是我为行指定的名称,这些行是美国农业部在怀俄明州的地块名称,第 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 行的数据集,我只展示了其中的一部分。

4

3 回答 3

1

假设您的数据在 data framea中,那么这应该可以解决问题:

a[!(a$ROW_NAMES %in% a[a$PRES_AB==1,'ROW_NAMES'] & a$PRES_AB==0),]
于 2013-07-12T15:06:48.633 回答
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 个观察或(如果多于 1 个观察)的 ROW_NAMES。

# subset dataset with subset() (or use extract, "[")
   # remove extra column "numid" for neatness
subset(dat1, numid < 2 | PRES_AB == 1, -numid)
于 2013-07-12T15:15:13.420 回答
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
于 2013-07-12T15:08:25.453 回答