假设我有一个如下所示的 Dataframe 。在该 Dataframe 中,我们有以下ID对(4330,4331)、(2333,2334)、(3336,3337),它们彼此相差+/- 1。但是,3349没有ID对。过滤掉不成对ID的最有效方法是什么?
ID sex zyg race SES
1 4330 2 2 2 1
2 4331 2 2 2 1
3 2333 2 2 1 78
4 2334 2 2 1 78
5 3336 2 2 1 18
6 3337 2 2 1 18
6 3349 2 2 1 18
2条答案
按热度按时间gjmwrych1#
这将只返回成对/双胞胎(没有不成对或三胞胎、四胞胎等)。
说明:
对数据进行排序后,只有组中的个体(双胞胎、三胞胎等)与下一行中的个体的ID差异为1。
diff(df$ID)
返回整个data.frame
中一行与下一行的ID
值的差异。要识别双胞胎,我们需要找出diff(df$ID)
在何处具有单独的1
(即,前一个值和下一个值都不是1
)。我们使用rle
来找到那些孤立的1
:当两个
diff(df$ID)
的值(values
)和相同值的游程长度(lengths
)都是1
。这在第三、第五和第八次运行时发生。(在df
内)由cumsum(lengths)
给出,因此我们将它们子集在3,5,和8来获得df
中每个孪生对的起始索引。我们用rep(..., each = 2)
重复这些索引中的每一个两次,然后加上0:1
(利用recycling in R)以获得作为双胞胎的任何个体的指数。dffbzjpn2#
使用
dplyr::lag()
和lead()
,可以将filter()
添加到前一个ID
为ID - 1
或下一个ID
为ID + 1
的行: