有条件地选择行来估计年份之间的生存

时间:2015-11-13 15:26:45

标签: r

我想选择2010年拍摄的ID,并在晚些时候重新获取。这里的问题是,我知道2010年没有重新获得的一些ID在人群中存在,因为它们被捕获,例如,在2009年,而不是在2010年,并在2011年再次被看到。我想要选择这些ID 。

我有这个数据集:

structure(list(BANDFINAL = structure(c(6L, 7L, 5L, 1L, 9L, 4L, 
2L, 3L, 8L, 10L), .Label = c("JP020", "JP1049", "JP1386", "JP1395/P789", 
"JP4762", "SH488_L", "SH714_L", "SH735_L", "SH760_L", "SH765_L"
), class = "factor"), ch = c("000000101010", "000000100000", 
"000000000010", "000000010000", "000000011000", "011111110100", 
"011101010000", "010110011000", "000000010101", "000000010000"
), y.2003 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), y.2004 = c(0, 0, 
0, 0, 0, 1, 1, 1, 0, 0), y.2005 = c(0, 0, 0, 0, 0, 1, 1, 0, 0, 
0), y.2006 = c(0, 0, 0, 0, 0, 1, 1, 1, 0, 0), y.2007 = c(0, 0, 
0, 0, 0, 1, 0, 1, 0, 0), y.2008 = c(0, 0, 0, 0, 0, 1, 1, 0, 0, 
0), y.2009 = c(1, 1, 0, 0, 0, 1, 0, 0, 0, 0), y.2010 = c(0, 0, 
0, 1, 1, 1, 1, 1, 1, 1), y.2011 = c(1, 0, 0, 0, 1, 0, 0, 1, 0, 
0), y.2012 = c(0, 0, 0, 0, 0, 1, 0, 0, 1, 0), y.2013 = c(1, 0, 
1, 0, 0, 0, 0, 0, 0, 0), y.2014 = c(0, 0, 0, 0, 0, 0, 0, 0, 1, 
0)), .Names = c("BANDFINAL", "ch", "y.2003", "y.2004", "y.2005", 
"y.2006", "y.2007", "y.2008", "y.2009", "y.2010", "y.2011", "y.2012", 
"y.2013", "y.2014"), row.names = c(2422L, 2521L, 1306L, 27L, 
2543L, 192L, 105L, 184L, 2533L, 2548L), class = "data.frame")

这是结果。

      BANDFINAL           ch y.2003 y.2004 y.2005 y.2006 y.2007 y.2008 y.2009 y.2010 y.2011 y.2012 y.2013 y.2014
2422     SH488_L 000000101010      0      0      0      0      0      0      1      0      1      0      1      0
2521     SH714_L 000000100000      0      0      0      0      0      0      1      0      0      0      0      0
1306      JP4762 000000000010      0      0      0      0      0      0      0      0      0      0      1      0
27         JP020 000000010000      0      0      0      0      0      0      0      1      0      0      0      0
2543     SH760_L 000000011000      0      0      0      0      0      0      0      1      1      0      0      0
192  JP1395/P789 011111110100      0      1      1      1      1      1      1      1      0      1      0      0
105       JP1049 011101010000      0      1      1      1      0      1      0      1      0      0      0      0
184       JP1386 010110011000      0      1      0      1      1      0      0      1      1      0      0      0
2533     SH735_L 000000010101      0      0      0      0      0      0      0      1      0      1      0      1
2548     SH765_L 000000010000      0      0      0      0      0      0      0      1      0      0      0      0

正如您在此处所看到的,ch是捕获历史记录,其余列是相同的捕获历史记录,但是拆分以查看标题中的年份。最终结果应如下所示:

       BANDFINAL           ch y.2003 y.2004 y.2005 y.2006 y.2007 y.2008 y.2009 y.2010 y.2011 y.2012 y.2013 y.2014
2422     SH488_L 000000101010      0      0      0      0      0      0      1      0      1      0      1      0
2543     SH760_L 000000011000      0      0      0      0      0      0      0      1      1      0      0      0
192  JP1395/P789 011111110100      0      1      1      1      1      1      1      1      0      1      0      0
184       JP1386 010110011000      0      1      0      1      1      0      0      1      1      0      0      0
2533     SH735_L 000000010101      0      0      0      0      0      0      0      1      0      1      0      1

如您所见,此最后一个数据集的第一个ID是在2009年捕获的,而不是在2010年和2011年。

您知道执行此命令的方法吗?

谢谢,

2 个答案:

答案 0 :(得分:3)

基本上您需要的是,在1之前或之前至少有一个2010存在,并且在2010年之后至少存在另一个1

此代码正是如此:

df[ grepl('1', substr(df$ch,1,8)) & grepl('1', substr(df$ch,9,12)), ]

输出与您需要的相同:

       BANDFINAL           ch y.2003 y.2004 y.2005 y.2006 y.2007 y.2008 y.2009 y.2010 y.2011 y.2012 y.2013 y.2014
2422     SH488_L 000000101010      0      0      0      0      0      0      1      0      1      0      1      0
2543     SH760_L 000000011000      0      0      0      0      0      0      0      1      1      0      0      0
192  JP1395/P789 011111110100      0      1      1      1      1      1      1      1      0      1      0      0
184       JP1386 010110011000      0      1      0      1      1      0      0      1      1      0      0      0
2533     SH735_L 000000010101      0      0      0      0      0      0      0      1      0      1      0      1

答案 1 :(得分:1)

您可以使用subset()

功能
subset(d, y.2010>0 & rowSums(d[,11:14])>0)

或者如果您想要在2009年捕获的ID:

subset(d, (y.2010>0 | y.2009>0) & rowSums(d[,11:14])>0)

您也可以在apply(d[,11:14]>0, 1, any)

的位置使用rowSums(d[,11:14])>0