根据二进制列值选择第一个和最后一个值

时间:2017-03-14 22:08:22

标签: r dataframe extract

我正在使用R,我有一个包含超过23,000个条目的数据框,如下所示:

 df[1:10,10:13]
   Start   End Distance      under50
1    248  1453        3            0
2   1450  2115      -30            0
3   2145  3254      -68            1
4   3322  5643       -3            0
5   5646  7451       -3            0
6   7454  8641      -14            0
7   8655  9860     -120            1
8   9980 11413      -65            1
9  11478 12614     -364            1
10 12978 13187     -275            1

我想要做的是基于df [,4]中的值从0开始到1结束,从df [,1]中选择第一个数字,用列选择df [,2]中的数字结束于1。

所以例如对于这个数据行#1从0开始,第2行也是0,第3行是1.所以我想从第1行获取248,从第3行获取3254然后将这些放在新的数据帧中列名称为Start和End。

然后我想循环查找数据帧中的每个实例。因此,对于此示例,它还将拉出行开始和行7结束的值。

所以最后我想要一个如下所示的提取数据框:

  Start   End      
1    248  3254                 
2   3322  9860
3   ####  ####

我尝试编写一个选择start的循环,如果df [,4] == 0并且基于df [,4] == 1结束但是它选择了每个以df [,4] == 0

我感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

# The under50 flag is 1 and has just gone up by 1: end of a group
df$group_end = (df$under50 == 1) & (c(0, diff(df$under50)) == 1)
# The under50 flag is 0 and has just gone down by 1 
#   (always true for first row): start of a group
df$group_start = c(-1, diff(df$under50)) == -1

starts = df$Start[df$group_start]
ends = df$End[df$group_end]

您可以查看group_endgroup_start列,了解它的工作原理。以下是示例数据集的输出:

> starts
[1]  248 3322
> ends
[1] 3254 9860

您可能需要稍微修改一下,具体取决于您的实际数据集如何看向最终行,它可能会识别出一个没有结束的额外开始。