R语言 如果ID在时间点x没有记录,则为每个ID添加行

j5fpnvbx  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(111)

我有一个浓度-时间数据集,看起来像这样:

ID    TIME    TLD    DV   ANALYTE
1     0.00    0.00   NA   1
1     0.16    0.16   5    1
1     2       2      4    1
1     6       6      2.5  1
1     12      12     1    1

实际上,当然有更多的ID和更多的列。(DV)记录,例如TIME 4和TIME 10。我想写一个代码,当TIME列没有TIME 4和10的DV记录时,为每个ID添加一行。TLD记录的值与TIME相同,直到168。之后,它重置为0。DV应该为NA为每一个添加的行。所以我想实现这样的东西:

ID    TIME    TLD    DV    ANALYTE
1     0.00    0.00   NA    1
1     0.16    0.16   5     1
1     2       2      4     1
1     4       4      NA    1
1     6       6      2.5   1 
1     10      10     NA    1
1     12      12     1     1

我试着做一个for循环,但是我对它不是很熟悉,现在对我来说似乎有点复杂。我希望有人能帮助我。

cuxqih21

cuxqih211#

我认为最简单的解决方案是首先创建一个单独的 Dataframe (例如time_data)的TIME值(和其他类似的变量,如TLD)。然后您可以将浓度数据left_join()到time_data,它将达到您想要的效果。例如:

library(tidyverse)

conc_data <- tibble(ID = rep(1, 5),
                    TIME = c(0, 0.16, 2, 6, 12),
                    TLD = c(0, 0.16, 2, 6, 12),
                    DV = c(NA, 5, 4 ,2.5,1),
                    ANALYTE = rep(1,5))

time_data <- tibble(TIME = c(0,0.16,2,4,6,10,12),
                    TLD = c(0,0.16,2,4,6,10,12),
                    ID = rep(1,7))

left_join(time_data, conc_data)

Joining with `by = join_by(TIME, TLD, ID)`
# A tibble: 7 × 5
   TIME   TLD    ID    DV ANALYTE
  <dbl> <dbl> <dbl> <dbl>   <dbl>
1  0     0        1  NA         1
2  0.16  0.16     1   5         1
3  2     2        1   4         1
4  4     4        1  NA        NA
5  6     6        1   2.5       1
6 10    10        1  NA        NA
7 12    12        1   1         1

为了将来的参考,如果你展示了用来创建你的示例数据的代码,这样我们就不必自己创建它了,这会让它变得更容易。一些关于你从哪里得到随机TIME间隔的解释将有助于抽象解决方案。

相关问题