我想统计一下每个ID栏下response个回复的波动数量.但回答No~no~DK.我需要考虑同样的react ,只是为了计算react 中的波动数量.我不会永久地改变回答.

df <- data.frame(
  id=c(1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4), 
  response=c("Yes","Yes","No","DK","no","No","No","no","No","Yes","Yes","DK","No","Yes","Yes","No","No","No","died","TO","Yes","No","Yes")
)

我正在使用以下代码进行try :

library(tidyverse)
df <- df %>%
  group_by(id) %>% fill(response) %>% 
  mutate(new = rleid(response), rn = row_number()) %>%  
  mutate(flactuation = case_when(rn >2 & duplicated(new) ~ 'No', rn > 2 ~ 'Yes')) %>% 
  mutate(numberofchange =  sum(flactuation=="Yes", na.rm = T)) %>% select(-rn, -flactuation)

预期

     id response   new numberofchange
   <dbl> <chr>    <int>          <int>
 1     1 Yes          1              1
 2     1 Yes          1              1
 3     1 No           2              1
 4     1 DK           2              1
 5     1 no           2              1
 6     2 No           1              1
 7     2 No           1              1
 8     2 no           1              1
 9     2 No           1              1
10     2 Yes          2              1
11     2 Yes          2              1
12     3 DK           1              2
13     3 No           1              2
14     3 Yes          2              2
15     3 Yes          2              2
16     3 No           3              2
17     3 No           3              2
18     4 No           1              5
19     4 died         2              5
20     4 TO           3              5
21     4 Yes          4              5
22     4 No           5              5
23     4 Yes          6              5

推荐答案

您可以使用data.table::rleid()来获得运行长度指数.

library(dplyr)

df %>%
  group_by(id) %>%
  mutate(new = data.table::rleid(replace(response, response %in% c('no', 'DK'), "No")),
         numberofchange = max(new) - 1) %>%
  ungroup()

# A tibble: 23 × 4
      id response   new numberofchange
   <dbl> <chr>    <int>          <dbl>
 1     1 Yes          1              1
 2     1 Yes          1              1
 3     1 No           2              1
 4     1 DK           2              1
 5     1 no           2              1
 6     2 No           1              1
 7     2 No           1              1
 8     2 no           1              1
 9     2 No           1              1
10     2 Yes          2              1
11     2 Yes          2              1
12     3 DK           1              2
13     3 No           1              2
14     3 Yes          2              2
15     3 Yes          2              2
16     3 No           3              2
17     3 No           3              2
18     4 No           1              5
19     4 died         2              5
20     4 TO           3              5
21     4 Yes          4              5
22     4 No           5              5
23     4 Yes          6              5

R相关问答推荐

bslib::card_header中的shine::downloadButton,图标而不是文本

将包含卷的底部25%的组拆分为2行

如何使用tryCatch执行语句并忽略警告?

使用Facet_WRAP时更改框图中线的 colored颜色

使用rvest从多个页面抓取时避免404错误

使用for循环和粘贴创建多个变量

当我添加美学时,geom_point未对齐

如何根据R中其他变量的类别汇总值?

我将工作代码重构为一个函数--现在我想不出如何传递轴列参数

有毒元素与表观遗传年龄的回归模型

R:使用ApexCharge更改标签在饼图中的位置

排序R矩阵的行和列

从data.table列表中提取特定组值,并在R中作为向量返回

根据部分名称匹配获取多组列的行求和

根据另两列的值替换值

将来自具有特定条件的两个不同数据帧的列相乘

R:迭代推算\回补缺失值的函数

带布尔子集的`<;-`如何创建不存在的列?

为什么序号(0:3)=1 2 3 4?

根据数据设置离散y轴的限制并编辑y轴标注