根据列在数据框上添加组计数器

时间:2017-08-24 14:31:25

标签: r dplyr mutate

假设我有一个带有距离变量string msg3= (string) System.Web.HttpContext.Current.Session["Msg3"]; 的排序数据框,表示变量d中度量之间的距离。

a

这给出了:

library(dplyr)
set.seed(1)
df <- 
  data.frame(a=sort(sample(2:20,8))) %>% 
  mutate(d = a-lag(a))

我正在尝试添加一种非计数器/分组变量> df a d 1 5 NA 2 7 2 3 8 1 4 9 1 5 11 2 6 14 3 7 15 1 8 16 1 ,它指示g是否大于,例如,2。d可以取值:g1,g2, ......等等。换句话说,我想在g&gt;时“增加”g 2.在下面的数据中我们得到:

d

我虽然使用了具有全局副作用的功能(是的,这通常是一个坏主意,我想不出别的):

>df a   d   g
1   5   NA  g1
2   7   2   g1
3   8   1   g1
4   9   1   g1
5   11  2   g1
6   14  3   g2
7   15  1   g2
8   16  1   g2

然后做:

f <- function(x){
  if(x)
    g <<- g +1
  return(paste0('g', g))
}

但是g=0 df %>% mutate(g = ifelse(is.na(d)|d>2, f(T), f(F))) 并没有增加mutate(或sapply)。在真实世界数据中,我可能有1000个g组。

2 个答案:

答案 0 :(得分:2)

你可以尝试,

with(df, paste0('g', cumsum(replace(d, is.na(d), 0) > 2)+1))
#[1] "g1" "g1" "g1" "g1" "g1" "g2" "g2" "g2"

答案 1 :(得分:0)

使用dplyrdata.table的解决方案。 df2是最终输出。

library(dplyr)
library(data.table)

df2 <- df %>%
  mutate(Large2 = ifelse(d > 2, 1, NA)) %>%
  mutate(RunID = rleid(Large2)) %>%
  mutate(ID = ifelse(RunID %% 2 == 0, RunID + 1, RunID)) %>%
  mutate(g = paste0("g", group_indices(., ID))) %>%
  select(a, d, g)