R 通过组变量创建计数连续变量
我有这样的数据:R 通过组变量创建计数连续变量,r,R,我有这样的数据: df<-data.frame(one=c(1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7, 7), test=c(1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0)) df一个选项是来自数据的rleid。表,按“一”的游程长度id分组,“测试”,将“测试”的和作为“想要”,按“一”分组,将“想要”变异为“想要”的max library(dplyr) library(d
df<-data.frame(one=c(1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7, 7),
test=c(1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0))
df一个选项是来自数据的rleid
。表
,按“一”的游程长度id分组,“测试”,将“测试”的和作为“想要”,按“一”分组,将“想要”变异为“想要”的max
library(dplyr)
library(data.table)
df %>%
group_by(grp = rleid(one, test))%>%
mutate(want = sum(test)) %>%
group_by(one) %>%
mutate(want = max(want)) %>%
dplyr::select(-grp)
# A tibble: 15 x 3
# Groups: one [7]
# one test want
# <dbl> <dbl> <dbl>
# 1 1 1 2
# 2 1 1 2
# 3 2 1 1
# 4 2 0 1
# 5 2 1 1
# 6 3 1 2
# 7 3 1 2
# 8 4 1 3
# 9 4 1 3
#10 4 1 3
#11 5 0 1
#12 5 1 1
#13 6 1 1
#14 7 0 0
#15 7 0 0
一个选项是来自数据的rleid
。表
,按“一”的游程长度id分组,“测试”,将“测试”的和
作为“想要”,按“一”分组,将
想要”变为“想要”的最大值
library(dplyr)
library(data.table)
df %>%
group_by(grp = rleid(one, test))%>%
mutate(want = sum(test)) %>%
group_by(one) %>%
mutate(want = max(want)) %>%
dplyr::select(-grp)
# A tibble: 15 x 3
# Groups: one [7]
# one test want
# <dbl> <dbl> <dbl>
# 1 1 1 2
# 2 1 1 2
# 3 2 1 1
# 4 2 0 1
# 5 2 1 1
# 6 3 1 2
# 7 3 1 2
# 8 4 1 3
# 9 4 1 3
#10 4 1 3
#11 5 0 1
#12 5 1 1
#13 6 1 1
#14 7 0 0
#15 7 0 0
您可以使用rle
获得1
不同运行的长度,然后取这些长度的最大值
library(dplyr)
df %>%
group_by(one) %>%
mutate(want = with(rle(test == 1), max(0, lengths[values], na.rm = TRUE)))
您可以使用rle
获得1
不同运行的长度,然后取这些长度的最大值
library(dplyr)
df %>%
group_by(one) %>%
mutate(want = with(rle(test == 1), max(0, lengths[values], na.rm = TRUE)))
尝试使用ave
、按one
列分组和test
列中不等于1的累积值之和在基数R中进行分组:
ave(df$test, list(df$one, cumsum(df$test != 1)), FUN=function(x) if(any(x==1)) sum(x) else x )
# [1] 2 2 1 1 1 2 2 3 3 3 1 1 1 0 0
这一逻辑的一个缩写为@RonakShah,其帽尖为:
ave(df$test == 1, df$one, cumsum(df$test != 1), FUN = sum)
尝试使用ave
、按one
列分组和test
列中不等于1的累积值之和在基数R中进行分组:
ave(df$test, list(df$one, cumsum(df$test != 1)), FUN=function(x) if(any(x==1)) sum(x) else x )
# [1] 2 2 1 1 1 2 2 3 3 3 1 1 1 0 0
这一逻辑的一个缩写为@RonakShah,其帽尖为:
ave(df$test == 1, df$one, cumsum(df$test != 1), FUN = sum)
不,ID==5只有一个连续的测试不,ID==5只有一个连续的测试你能给你的代码示例添加一个解释吗?这将有助于其他用户了解这里发生了什么。您能在代码示例中添加解释吗?这将有助于其他用户了解这里发生了什么。@RonakShah-实际上这要好得多。已经编辑好了。@RonakShah-实际上好多了。编辑过。