RでグループによってNA行の上に合計する方法

klumbard:

のは、私は、次のデータフレームを持っているとしましょう:

mydat <- structure(list(Group = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L
), .Label = c("A", "B"), class = "factor"), Day = c(1, 2, 3, 
1, 2, 3, 4), Var1 = c(2, 3, 5, 12, NA, NA, 51), Var2 = c(5, 6, 
2, 0, 40, 50, 3)), class = "data.frame", row.names = c(NA, -7L
))

mydat

  Group Day Var1 Var2
1     A   1    2    5
2     A   2    3    6
3     A   3    5    2
4     B   1   12    0
5     B   2   NA   40
6     B   3   NA   50
7     B   4   51    3

私は(好ましくはdplyrで)やりたいことはある:グループによって、行見つけVar1ありNA、そしてそれらの行を超えるを合計Var2し、その中で次の行ではその合計含まれVar1ていないがNAなど:

mydat_new <- structure(list(Group = structure(c(1L, 1L, 1L, 2L, 2L), .Label = c("A", 
"B"), class = "factor"), Day = c(1, 2, 3, 1, 4), Var1 = c(2, 
3, 5, 12, 51), Var2 = c(5, 6, 2, 0, 93)), class = "data.frame", row.names = c(NA, 
-5L))

mydat_new

  Group Day Var1 Var2
1     A   1    2    5
2     A   2    3    6
3     A   3    5    2
4     B   1   12    0
5     B   4   51   93

そうではGroupB、日間2及び3と行がなくなっている、と彼らのVar2貢献は、その次の日に「吸収」されていVar1ないがNA、すなわち4日目。

arg0naut91:

1つのオプションは、次のようになります。

library(dplyr)

mydat %>%
  group_by(Group, idx = rev(cumsum(rev(!is.na(Var1))))) %>%
  mutate(Var2 = sum(Var2)) %>%
  ungroup() %>%
  filter(!is.na(Var1)) %>%
  select(-idx)

出力:

# A tibble: 5 x 4
  Group   Day  Var1  Var2
  <fct> <dbl> <dbl> <dbl>
1 A         1     2     5
2 A         2     3     6
3 A         3     5     2
4 B         1    12     0
5 B         4    51    93

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=377542&siteId=1