【问题标题】:Get range of adjacent rows with the same value获取具有相同值的相邻行的范围
【发布时间】:2015-02-14 11:57:36
【问题描述】:

我有一个如下的数据框。第一列是位置,最后一列是水平。我想在相邻行中输出具有相同数量的行范围。任何带有“2”的东西都应该被忽略。你能帮忙吗

输入:

 1          3
10000       3
20000       3
30000       1
40000       2
50000       2
60000       2
70000       3
80000       1
90000       1

The output
 1-  2999 3
3000-3999 1
7000-7999 3
8000-9999 1

【问题讨论】:

    标签: r


    【解决方案1】:

    这是使用dplyr 的转换函数的方法。这是示例数据

    dd <- structure(list(pos = c(1L, 10000L, 20000L, 30000L, 40000L, 50000L, 
      60000L, 70000L, 80000L, 90000L), level = c(3L, 3L, 3L, 1L, 2L, 
      2L, 2L, 3L, 1L, 1L)), .Names = c("pos", "level"), class = "data.frame",
      row.names = c(NA, -10L))
    dd <- dd[order(dd$pos), ]  #make sure its sorted by position
    

    如果你下一个位置的差总是10000,你可以这样做

    library(dplyr)
    dd %>% arrange(pos) %>% 
        mutate(run=cumsum(c(0,diff(level))!=0)) %>% 
        subset(level!=2) %>% 
        group_by(run) %>%
        summarise(level=max(level), start=min(pos), end=max(pos)+9999) %>%
        select(-run)
    
    #   level start   end
    # 1     3     1 29999
    # 2     1 30000 39999
    # 3     3 70000 79999
    # 4     1 80000 99999
    

    否则

    dd %>% arrange(pos) %>% 
        mutate(run=cumsum(c(0,diff(level))!=0), nextpos=lead(pos)) %>% 
        subset(level!=2) %>% 
        group_by(run) %>%
        summarise(level=max(level), start=min(pos), end=max(nextpos)-1) %>%
        select(-run)
    
    #   level start   end
    # 1     3     1 29999
    # 2     1 30000 39999
    # 3     3 70000 79999
    # 4     1 80000    NA
    

    可以计算除最后一组以外的所有人到下一组的距离。

    【讨论】:

    • 好的,第一个答案就是我想要的。怕被骂可以加个twister吗?如果有另一个名为 home 的列怎么办。每个家庭都有开始和结束位置,因此我希望获得特定于家庭的范围开始和结束位置。我已经将示例放在上面的编辑代码中
    • @user3632206 group_by(home) 在顶部(紧跟在dd %&gt;% 之后)不行吗?
    猜你喜欢
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多