假设我有一个带有距离变量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
组。
答案 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)
使用dplyr
和data.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)