【发布时间】:2020-05-16 21:34:15
【问题描述】:
根据以下数据:
library(tidyverse)
limit <- c(7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5)
group <- c("a", "a", "a", "a", "a", "a", "a", "a", "a","b", "b", "b", "b", "b", "b", "b", "b", "b", "c", "c", "c", "c", "c", "c", "c", "c", "c")
df <- data.frame(limit, group)
df
我想创建一个新列(NewCol),如下所示:
如果存在限制 = Id 的行,则在 NewCol 上应该为 0。但是我希望 0 之前的所有行都以相反的顺序返回,直到组的第一行,并且 0 之后的所有行都被计算到组的末尾。
例如,在这种情况下,对于组“a”,它应该看起来像
-6, -5, -4, -3, -2, -1, 0, 1, 2 其中 -6 是该组的第一行,2 是该组的第 9 行。
这是我尝试过的,但仍然没有得到我需要的东西
df %>% group_by(group) %>% mutate(Id = seq(1:length(limit))) %>%
mutate(NewCol = ifelse(limit == Id, 0, NA)) %>%
mutate(nn=ifelse(is.na(NewCol),
zoo::na.locf(NewCol) + cumsum(is.na(NewCol))*1,
NewCol))
谢谢
【问题讨论】:
-
如果没有
limit = Id所在的行怎么办?每个组的限制都相同吗? -
是的,所有组的行数都相同,唯一改变的是限制的位置
标签: r dplyr tidyverse rowcount