我在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行的数据集,我只是展示了它的一部分。
答案 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)