我尝试使用索引和匹配调整数据点并将其应用于 R 中数据集中的指定组

I tried to adjust datapoint using index and match and applied it to specified group in dataset in R

我有一个记录鸡感染状态的数据集。鸡群中的第一列是I和S,其余列是每个采样时间的状态(0,1)。我需要调整 I 组中的信息,我想用 0.5 替换第一个 1 之前的最后一个 0。 我使用索引和匹配在向量上进行了尝试

v= c(0,0,1,0,1,1,1) 
v[[match(1,v) -1]] = 0.5 

但我正在努力将其应用于数据集 我在这里写了一个简化版本的数据框

dftry <- data.frame("Role" = c("I", "I", "S", "S", "S", "I"),
                  "T1" = c(0,0, 0, 0, 0, 0),
                  "T2" = c(0,0, 0, 0, 0, 0),
                  "T3"= c(0,0, 1, 0, 1, 1),
                  "T4"= c(1,1,1, 1, 1, 1))** 

所需的输出应如下所示

dftry <- data.frame("Role" = c("I", "I", "S", "S", "S", "I"),
                  "T1" = c(0,0, 0, 0, 0, 0),
                  "T2" = c(0,0, 0, 0, 0, 0.5),
                  "T3"= c(0.5,0.5, 1, 0, 1, 1),
                  "T4"= c(1,1,1, 1, 1, 1))

我试过使用 mutate 和 innerjoin,但似乎不起作用。请帮忙

这是一种方法。您可以添加行号以独立地考虑每一行。使用 pivot_longer,您可以将数据放入长格式,然后为 Role 为“I”的数据寻找随时间从 0 到 1 的转换(从 T1 到 T4)。数据可以以这种方式保留以供进一步操作或分析,或转换回宽格式,如下所示。请注意,此解决方案考虑了从一种状态到另一种状态的转换(感染状态 0 到 1)——不一定要查看这是否涉及给定 Role.

的“第一个”状态 1
library(tidyverse)

dftry %>%
  mutate(rn = row_number()) %>%
  pivot_longer(cols = -c(Role, rn)) %>%
  group_by(rn) %>%
  mutate(value = ifelse(
    Role == "I" & value == 0 & lead(value) == 1, .5, value
  )) %>%
  pivot_wider(id_cols = c(Role, rn))

输出

  Role     rn    T1    T2    T3    T4
  <chr> <int> <dbl> <dbl> <dbl> <dbl>
1 I         1     0   0     0.5     1
2 I         2     0   0     0.5     1
3 S         3     0   0     1       1
4 S         4     0   0     0       1
5 S         5     0   0     1       1
6 I         6     0   0.5   1       1