R 如果存在缺勤,是否删除缺勤数据?
我在R中有这样一个数据集:R 如果存在缺勤,是否删除缺勤数据?,r,sorting,if-statement,delete-row,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.12
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=1
),我想删除PRES_AB=0
的行。然后,我的数据应该如下所示:
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
顺便说一句,这是一个包含81000行的数据集,我只是展示了其中的一部分。假设您的数据位于数据框
a
中,那么这应该可以做到:
a[!(a$ROW_NAMES %in% a[a$PRES_AB==1,'ROW_NAMES'] & a$PRES_AB==0),]
假设您的数据在数据帧
a
中,那么这应该可以做到:
a[!(a$ROW_NAMES %in% a[a$PRES_AB==1,'ROW_NAMES'] & a$PRES_AB==0),]
这可以使用子集设置和%函数中的
%
> 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
>test.data test.data
行名称PRES_AB其他数据
1 A 1 bla
2 A 0 bla
3 B 1 bla
4 C 0等
5、D、1等
6d0等
>test.data[!(test.data[,“ROW_NAMES”]%in%(test.data[test.data[,“PRES_AB”]=1,“ROW_NAMES”])和(test.data[,“PRES_AB”]=0)),]
行名称PRES_AB其他数据
1 A 1 bla
3 B 1 bla
4 C 0等
5、D、1等
这可以使用子集设置和%
中的%功能来完成:
> 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
>test.data test.data
行名称PRES_AB其他数据
1 A 1 bla
2 A 0 bla
3 B 1 bla
4 C 0等
5、D、1等
6d0等
>test.data[!(test.data[,“ROW_NAMES”]%in%(test.data[test.data[,“PRES_AB”]=1,“ROW_NAMES”])和(test.data[,“PRES_AB”]=0)),]
行名称PRES_AB其他数据
1 A 1 bla
3 B 1 bla
4 C 0等
5、D、1等
我的答案分为两步,因为这通常是我思考选择哪一行的逻辑的方式
首先,我创建一个列,列中包含关于每个行名的观察次数的信息
require(plyr)
# Add column with information on how many observations for each ROW_NAME
dat1 = ddply(dat1, .(ROW_NAMES), transform, numid = length(PRES_AB) )
一旦我有了这些信息,我就可以使用逻辑运算符只提取少于2个观察值或(如果超过1个观察值)PRES_AB为1的行名称
# subset dataset with subset() (or use extract, "[")
# remove extra column "numid" for neatness
subset(dat1, numid < 2 | PRES_AB == 1, -numid)
#具有subset()的子集数据集(或使用extract,“[”)
#移除额外的“numid”列以保持整洁
子集(dat1,numid<2 | PRES_AB==1,-numid)
我的答案分为两步,因为这通常是我思考选择哪一行的逻辑的方式
首先,我创建一个列,列中包含关于每个行名的观察次数的信息
require(plyr)
# Add column with information on how many observations for each ROW_NAME
dat1 = ddply(dat1, .(ROW_NAMES), transform, numid = length(PRES_AB) )
一旦我有了这些信息,我就可以使用逻辑运算符只提取少于2个观察值或(如果超过1个观察值)PRES_AB为1的行名称
# subset dataset with subset() (or use extract, "[")
# remove extra column "numid" for neatness
subset(dat1, numid < 2 | PRES_AB == 1, -numid)
#具有subset()的子集数据集(或使用extract,“[”)
#移除额外的“numid”列以保持整洁
子集(dat1,numid<2 | PRES_AB==1,-numid)