【问题标题】:R sum consecutive duplicate odd rows and remove all but firstR对连续重复的奇数行求和并删除除第一个以外的所有行
【发布时间】:2019-04-08 16:53:19
【问题描述】:

我遇到了一个问题 - 如何对连续重复的奇数行求和并删除除第一行之外的所有行。我已经知道如何对连续重复行求和并删除除第一行之外的所有行(链接:https://stackoverflow.com/a/32588960/11323232)。但是这个项目,我想对连续重复的奇数行求和,而不是对所有连续重复的行求和。

 ia<-c(1,1,2,NA,2,1,1,1,1,2,1,2)
 time<-c(4.5,2.4,3.6,1.5,1.2,4.9,6.4,4.4, 4.7, 7.3,2.3, 4.3)
 a<-as.data.frame(cbind(ia, time))

  a
   ia time
1   1  4.5
2   1  2.4
3   2  3.6
5   2  1.2
6   1  4.9
7   1  6.4
8   1  4.4
9   1  4.7
10  2  7.3
11  1  2.3
12  2  4.3

to 

 a
   ia time
1   1  6.9
3   2  3.6
5   2  1.2
6   1  20.4
10  2  7.3
11  1  2.3
12  2  4.3

如何为我的目标编辑以下代码以求和连续重复的奇数行并删除除第一行以外的所有行?

 result <- a %>%
 filter(na.locf(ia) == na.locf(ia, fromLast = TRUE)) %>%
 mutate(ia = na.locf(ia)) %>%
 mutate(change = ia != lag(ia, default = FALSE)) %>%
 group_by(group = cumsum(change), ia) %>%
 # this part
 summarise(time = sum(time))

【问题讨论】:

  • 感谢 tmfmnk 和 Patrik_P。我有其他问题。如果“时间”是相同长度的列表。我该怎么做?比如时间

标签: r


【解决方案1】:

dplyr 的一种可能是:

a %>%
 group_by(grp = with(rle(ia), rep(seq_along(lengths), lengths))) %>%
 mutate(grp2 = ia %/% 2 == 0,
        time = sum(time)) %>%
 filter(!grp2 | (grp2 & row_number() == 1)) %>%
 ungroup() %>%
 select(-grp, -grp2)

      ia  time
  <dbl> <dbl>
1     1   6.9
2     2   3.6
3     2   1.2
4     1  20.4
5     2   7.3
6     1   2.3
7     2   4.3

【讨论】:

    【解决方案2】:

    您可以尝试使用以下data.table

    library(data.table)
    ia <- c(1,1,2,NA,2,1,1,1,1,2,1,2)
    time <- c(4.5,2.4,3.6,1.5,1.2,4.9,6.4,4.4, 4.7, 7.3,2.3, 4.3)
    a <- data.table(ia, time)
    a[, sum(time), by=.(ia, rleid(!ia %% 2 == 0))]
    

    给予

    ##   ia rleid   V1
    ##1:  1     1  6.9
    ##2:  2     2  3.6
    ##3: NA     3  1.5
    ##4:  2     4  1.2
    ##5:  1     5 20.4
    ##6:  2     6  7.3
    ##7:  1     7  2.3
    ##8:  2     8  4.3
    

    【讨论】:

    • 太棒了!谢谢你好patrik_P。如果“时间”是相同长度的列表。我该怎么做?比如时间
    • 如果您将列表分配为 data.table 中的列,您可以这样做 time2 &lt;- list(c(4.5,2), 2.4,3.6,1.5,1.2,4.9,6.4,4.4, 4.7, 7.3,2.3, 4.3); a2 &lt;- data.table(ia, time2); a2[, .(SUMtime = sum(unlist(time2))), by=.(ia, rleid(!ia %% 2 == 0))]
    • 再次感谢。可能会有一些误导。你能看看下面的问题吗?我推送了一个描述更新请求的新问题。 stackoverflow.com/q/55571484/11323232
    猜你喜欢
    • 2015-12-11
    • 1970-01-01
    • 2019-04-21
    • 2023-01-20
    • 2019-11-14
    • 1970-01-01
    • 2021-01-28
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多