gpt4 book ai didi

r - 按行计算数字序列

转载 作者:行者123 更新时间:2023-12-04 22:56:11 26 4
gpt4 key购买 nike

我有以下数据框 0 , 1 , 和 不适用 一年内 ID A 到 E 的 s:

dat <- data.frame(
id = c("A", "B", "C", "D", "E"),
jan = c(0, 0, NA, 1, 0),
feb = c(0, 1, 1, 0, 0),
mar = c(0, 0, 1, 0, 1),
apr = c(0, NA, 0, NA, 1),
may = c(0, NA, 0, 0, 0),
jun = c(0, 0, 0, 0, 0),
jul = c(0, 0, 0, 0, 1),
aug = c(NA, 0, 0, 1, 1),
sep = c(NA, 0, 0, 1, NA),
okt = c(NA, 0, 0, 0, NA),
nov = c(NA, 0, 0, 0, 1),
dez = c(NA, 0, 0, 0, 0)
)

> dat
id jan feb mar apr may jun jul aug sep okt nov dez
A 0 0 0 0 0 0 0 NA NA NA NA NA
B 0 1 0 NA NA 0 0 0 0 0 0 0
C NA 1 1 0 0 0 0 0 0 0 0 0
D 1 0 0 NA 0 0 0 1 1 0 0 0
E 0 0 1 1 0 0 1 1 NA NA 1 0

我想统计这个一年期间每个ID的1的数量,但需要满足以下条件:
  • 第一次出现的 1 总是计为 1
  • NA 应被视为 0
  • 如果 1 前面是 ,则仅计算第二次出现的 1六个或更多 0s/NAs

  • 在我的示例中,计数为:
    > dat
    id jan feb mar apr may jun jul aug sep okt nov dez count
    1 A 0 0 0 0 0 0 0 NA NA NA NA NA => 0
    2 B 0 1 0 NA NA 0 0 0 0 0 0 0 => 1
    3 C NA 1 1 0 0 0 0 0 0 0 0 0 => 1
    4 D 1 0 0 NA 0 0 0 1 1 0 0 0 => 2
    5 E 0 0 1 1 0 0 1 1 NA NA 1 0 => 1

    该函数应以 apply(dat[, -1], 1, my_fun) 的形式逐行应用并返回一个包含计数的向量(即 0, 1, 1, 2, 1 )。有人知道如何实现这一目标吗?

    最佳答案

    如何使用rollapply从动物园包:

    library(zoo)
    library(magrittr)

    myfun <- function(y, pattern = c(0,0,0,0,0,0,1)){
    y[is.na(y)] <- 0 # to account for both 0s and NAs
    first <- sum(y[1:(length(pattern)-1)])!=0
    rest <- y %>% as.numeric() %>% rollapply(7, identical, pattern) %>% sum
    return(first+rest)
    }

    apply(dat[,-1],1,myfun)

    [1] 0 1 1 2 1

    rollapply 部分将匹配每行中六个 0 后跟一个 1 的任何序列。

    唯一剩下的就是在前 6 个月内计算 1s(您想计算但不会与 rollapply 匹配)。这是通过 myfun 的第一行完成的.

    关于r - 按行计算数字序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45319050/

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