使用dplyr以每个组或行的特定值获取第一列的索引
我有以下脚本。选项1使用长格式和使用dplyr以每个组或行的特定值获取第一列的索引,r,dplyr,purrr,R,Dplyr,Purrr,我有以下脚本。选项1使用长格式和group_by识别状态为0的许多步骤的第一步 另一个选项(2)是使用apply为每行计算该值,然后将数据转换为长格式 firs选项无法很好地扩展。第二个是,但我无法将其放入dplyr管道。我试图用purr解决这个问题,但没有成功 问题: 为什么第一个选项不能很好地扩展 如何在dplyr管道中转换第二个选项 需要(dplyr) 需要(三年) 需要(ggplot2) 种子(314) #示例数据 dat% 聚集(步骤,状态,-id)%>% 分组依据(id)%>%
group_by
识别状态为0的许多步骤的第一步
另一个选项(2)是使用apply
为每行计算该值,然后将数据转换为长格式
firs选项无法很好地扩展。第二个是,但我无法将其放入dplyr
管道。我试图用purr
解决这个问题,但没有成功
问题:
- 为什么第一个选项不能很好地扩展
- 如何在
管道中转换第二个选项dplyr
需要(dplyr)
需要(三年)
需要(ggplot2)
种子(314)
#示例数据
dat%
聚集(步骤,状态,-id)%>%
分组依据(id)%>%
突变(drop=min(if_else(状态==0,匹配(步骤,步骤),99L))%>%
变异(状态=if_else(匹配(步骤,步骤)>=drop,0,1))
ggplot(数据累积,aes(x=阶跃,填充=因子(状态)))+
geom_bar()
#选择2更快
dat美元下降%
变异(状态=if_else(匹配(步骤,步骤)>=drop,0,1))
ggplot(数据累积,aes(x=阶跃,填充=因子(状态)))+
geom_bar()
如果要沿行映射,可以执行以下操作:
dat %>%
mutate(drop2 = map_int(seq_len(nrow(dat)), ~ min(which(dat[.x, ] == 0L), 99L)))
可能是“收集和分组”比循环更快:
dat %>%
as_tibble() %>%
select(starts_with("step_")) %>%
mutate(row_nr = row_number()) %>%
gather(key = "col", value = "value", -row_nr) %>%
arrange(row_nr, col) %>%
group_by(row_nr) %>%
mutate(col_index = row_number()) %>%
filter(value == 0) %>%
summarise(drop3 = min(col_index)) %>%
ungroup() %>%
right_join(dat %>%
mutate(row_nr = row_number()),
by = "row_nr") %>%
mutate(drop3 = if_else(is.na(drop3), 99, drop3))
管道序列中的第二个选项可以是
dat%>%mutate(drop=apply(,1,函数(x)min(其中(x==0,99)))%>%gather(…