如何更新R中特定列的值

8oomwypt  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(110)

以下是部分示例数据:

dat<-read.table (text=" ID    Time    B1  T1  Q1  W1  M1
    1   12  12  0   12  11  9
    1   13  0   1   NA  NA  NA
    2   10  12  0   6   7   8
    2   14  0   1   NA  NA  NA
    1   16  16A 0   1   2   4
    1   14  0   1   NA  NA  NA
    2   14  16A 0   5   6   7
    2   7   0   1   NA  NA  NA
    1   7   20  0   5   8   0
    1   7   0   1   NA  NA  NA
    2   9   20  0   7   8   1
    2   9   0   1   NA  NA  NA

    ", header=TRUE)

我想更新T1列中重复ID的值1。对于第一个重复ID,应为值1,对于第二个重复ID,应为值2;对于第三个重复的ID,值为3,依此类推。我还想用空白单元格替换NA。下面是预期结果:

ID  Time    B1  T1  Q1  W1  M1
1   12  12  0   12  11  9
1   13  0   1           
2   10  12  0   6   7   8
2   14  0   1           
1   16  16A 0   1   2   4
1   14  0   2           
2   14  16A 0   5   6   7
2   7   0   2           
1   7   20  0   5   8   0
1   7   0   3           
2   9   20  0   7   8   1
2   9   0   3
yhuiod9q

yhuiod9q1#

您可以将ifelseacrosscumsum一起用于每个组,如下所示:

library(dplyr)
dat %>%
  group_by(ID, B1) %>%
  mutate(across(T1, ~ ifelse(.x == 1, cumsum(.x), T1)))
#> # A tibble: 12 × 7
#> # Groups:   ID, B1 [8]
#>       ID  Time B1       T1    Q1    W1    M1
#>    <int> <int> <chr> <int> <int> <int> <int>
#>  1     1    12 12        0    12    11     9
#>  2     1    13 0         1    NA    NA    NA
#>  3     2    10 12        0     6     7     8
#>  4     2    14 0         1    NA    NA    NA
#>  5     1    16 16A       0     1     2     4
#>  6     1    14 0         2    NA    NA    NA
#>  7     2    14 16A       0     5     6     7
#>  8     2     7 0         2    NA    NA    NA
#>  9     1     7 20        0     5     8     0
#> 10     1     7 0         3    NA    NA    NA
#> 11     2     9 20        0     7     8     1
#> 12     2     9 0         3    NA    NA    NA

创建于2023年1月14日,使用reprex v2.0.2

sr4lhrrt

sr4lhrrt2#

使用data.table

library(data.table)
setDT(dat)[T1 ==1, T1 := cumsum(T1), .(ID, B1)]
  • 输出
> dat
    ID Time  B1 T1 Q1 W1 M1
 1:  1   12  12  0 12 11  9
 2:  1   13   0  1 NA NA NA
 3:  2   10  12  0  6  7  8
 4:  2   14   0  1 NA NA NA
 5:  1   16 16A  0  1  2  4
 6:  1   14   0  2 NA NA NA
 7:  2   14 16A  0  5  6  7
 8:  2    7   0  2 NA NA NA
 9:  1    7  20  0  5  8  0
10:  1    7   0  3 NA NA NA
11:  2    9  20  0  7  8  1
12:  2    9   0  3 NA NA NA

相关问题