gpt4 book ai didi

r - 计算自上次观察以来满足条件的行数

转载 作者:行者123 更新时间:2023-12-04 15:17:26 25 4
gpt4 key购买 nike

我的 Data Frame看起来像这个例子的前三列:

id    obs   value   newCol
a 1 uncool NA
a 2 cool 1
a 3 uncool NA
a 4 uncool NA
a 5 cool 2
a 6 uncool NA
a 7 cool 1
a 8 uncool NA
b 1 cool 0

我需要的是一列( newCol 上面),它计算值为“cool”或组的第一行(按 id 分组)的观察值之间“uncool”的数量。

我该怎么做(最好使用 dplyr)?

最佳答案

我们可以通过执行 cumsum 来定义组从底部开始,然后使用 ave为每个组构建一​​个向量:

transform(dat, newCol = ave(
value, id, rev(cumsum(rev(value=="cool"))),
FUN = function(x) ifelse(x=="cool", length(x)-1, NA)))
# id obs value newCol
# 1 a 1 uncool <NA>
# 2 a 2 cool 1
# 3 a 3 uncool <NA>
# 4 a 4 uncool <NA>
# 5 a 5 cool 2
# 6 a 6 uncool <NA>
# 7 a 7 cool 1
# 8 a 8 uncool <NA>
# 9 b 1 cool 0

使用 dplyr :
dat %>%
group_by(id,temp = rev(cumsum(rev(value=="cool")))) %>%
mutate(newCol = ifelse(value=="cool", n()-1, NA)) %>%
ungroup() %>%
select(-temp)
# # A tibble: 9 x 4
# id obs value newCol
# <chr> <int> <chr> <dbl>
# 1 a 1 uncool NA
# 2 a 2 cool 1
# 3 a 3 uncool NA
# 4 a 4 uncool NA
# 5 a 5 cool 2
# 6 a 6 uncool NA
# 7 a 7 cool 1
# 8 a 8 uncool NA
# 9 b 1 cool 0

关于r - 计算自上次观察以来满足条件的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54570330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com