【问题标题】:repeat first observation for each id对每个 id 重复第一次观察
【发布时间】:2023-03-23 07:24:01
【问题描述】:

我有如下数据集

 Obs#      Id          Date              Med          Dosage      Result
  1        1567        01/03/2011        Acebutol     10mg        100.2
  2        1567        04/02/2011        Acebutol     10mg        98.6
  3        1567        08/14/2011        Oxaprozin    20mg        99.34
  4        1567        08/14/2011        Bayer        20mg        99.34
  5        7845        02/01/2011        Bayer        20mg        89.64
  6        7845        06/14/2011        Bayer        20mg        95.41 
  7        7845        01/06/2012        Bayer        50mg        89.92
  8        7845        01/06/2012        Acebutol     50mg        89.92
  9        7845        04/19/2012        Bayer        50mg        95.15
 10        7845        09/25/2012        Bayer        50mg        99.37
 11        1567        01/14/2012        Oxaprozin    20mg        89.34
 12        1567        05/12/2012        Oxaprozin    20mg        91.4


Test2 <- structure(list(Obs. = 1:12, Id = c(1567L, 1567L, 1567L, 1567L, 
7845L, 7845L, 7845L, 7845L, 7845L, 7845L, 1567L, 1567L), Date =               
structure(c(1L,5L, 9L, 9L, 4L, 8L, 2L, 2L, 6L, 10L, 3L, 7L), .Label =          
c("01/03/2011", "01/06/2012", "01/14/2012", "02/01/2011", "04/02/2011",     
"04/19/2012","05/12/2012", "06/14/2011", "08/14/2011", "09/25/2012"), class      
= "factor"),Med = structure(c(1L, 1L, 3L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 
3L, 3L), .Label = c("Acebutol", "Bayer", "Oxaprozin"), class = "factor"), 
Dosage = structure(c(3L, 3L, 4L, 1L, 1L, 1L, 2L, 5L, 2L, 
2L, 4L, 4L), .Label = c(" 20mg", " 50mg", "10mg", "20mg", 
"50mg"), class = "factor"), Result = c(100.2, 98.6, 99.34, 
99.34, 89.64, 95.41, 89.92, 89.92, 95.15, 99.37, 89.34, 91.4
)), .Names = c("Obs.", "Id", "Date", "Med", "Dosage", "Result"
), class = "data.frame", row.names = c(NA, -12L))

我正在使用扩展函数来转换这个数据集,如下所示

library(dplyr)
library(tidyr)
library(doBy)
Test2$X <- NULL
Test2$Obs. <- NULL
Test21 = Test2 %>% spread(Med, Dosage, fill = 0)
Test22  = Test21 %>% rename(Date2 = Date) %>% mutate(Date1 = NA)
Test22$Date2 = as.Date(Test22$Date2, "%m/%d/%Y")
Test22 = orderBy(~Id+Date2, data=Test22)

    Id      Date2        Result     Acebutol Bayer    Oxaprozin   Date1
    1567    2011-01-03   100.20     10mg     0        0           NA
    1567    2011-04-02   98.60      10mg     0        0           NA
    1567    2011-08-14   99.34      0        20mg     20mg        NA
    1567    2012-01-14   89.34      0        0        20mg        NA
    1567    2012-05-12   91.40      0        0        20mg        NA
    7845    2011-02-01   89.64      0        20mg     0           NA
    7845    2011-06-14   95.41      0        20mg     0           NA
    7845    2012-01-06   89.92      50mg     50mg     0           NA
    7845    2012-04-19   95.15      0        50mg     0           NA
    7845    2012-09-25   99.37      0        50mg     0           NA

我要做的是对每个 Id 重复第一次观察

    Id      Date2        Result     Acebutol Bayer    Oxaprozin   Date1

  **1567    2011-01-03   100.20     0        0        0           NA

    1567    2011-01-03   100.20     10mg     0        0           NA
    1567    2011-04-02   98.60      10mg     0        0           NA
    1567    2011-08-14   99.34      0        20mg     20mg        NA
    1567    2012-01-14   89.34      0        0        20mg        NA
    1567    2012-05-12   91.40      0        0        20mg        NA

  **7845    2011-02-01   89.64      0        0        0           NA

    7845    2011-02-01   89.64      0        20mg     0           NA
    7845    2011-06-14   95.41      0        20mg     0           NA
    7845    2012-01-06   89.92      50mg     50mg     0           NA
    7845    2012-04-19   95.15      0        50mg     0           NA
    7845    2012-09-25   99.37      0        50mg     0           NA

不知道怎么做,感谢任何帮助。

【问题讨论】:

  • @Pascal,好问题,这些是我目前使用的包,dplyr, tidyr, doBy我已经用这些信息更新了代码
  • 在您的示例中,每个 ID 的第一个 obs 使用相同的 ID、Date2 和 Result 列重复,但您似乎将药物列设置为 0。这是您想要的还是错字?
  • @Gregor,你说的很对,这是设计,不是错别字
  • 运行您的示例,我收到警告([&lt;-.factor(*tmp*, is.na(ordered), value = 0) 中的警告:无效因子水平,NA 生成 i>) 由spread 函数生成(tidyr 版本0.2.0)。
  • @Pascal, ,将列 Meds 更改为字符应该可以解决此问题,

标签: r transformation dplyr tidyr


【解决方案1】:
Test22 %>%
  group_by(Id) %>%
  slice(1) %>% # select the first row of each ID
  mutate_each(funs(set0 = c("0")), 4:6) %>% # recode columns 4-6 as zero
  bind_rows(., Test22) %>% # rbind the new zeroed-out top rows to the original
  arrange(Id, Date2, Result) # sort back to the preferred order

Source: local data frame [12 x 7]

     Id      Date2 Result Acebutol Bayer Oxaprozin Date1
1  1567 2011-01-03 100.20        0     0         0    NA
2  1567 2011-01-03 100.20     10mg    NA        NA    NA
3  1567 2011-04-02  98.60     10mg    NA        NA    NA
4  1567 2011-08-14  99.34       NA  20mg      20mg    NA
5  1567 2012-01-14  89.34       NA    NA      20mg    NA
6  1567 2012-05-12  91.40       NA    NA      20mg    NA
7  7845 2011-02-01  89.64        0     0         0    NA
8  7845 2011-02-01  89.64       NA  20mg        NA    NA
9  7845 2011-06-14  95.41       NA  20mg        NA    NA
10 7845 2012-01-06  89.92     50mg  50mg        NA    NA
11 7845 2012-04-19  95.15       NA  50mg        NA    NA
12 7845 2012-09-25  99.37       NA  50mg        NA    NA

【讨论】:

  • 我遇到了 bind_rows 函数的问题。我收到一个错误函数 bind_rows not found。我卸载并重新安装了 dplyr ,我的 dplyr 版本是 0.3.0.2
  • 您可以在此处将bind_rows() 替换为rbind() 并获得相同的结果。
  • 可行,但我想将其应用于更大的数据集,我担心硬编码第 4、6 行可能会导致一些问题,mutate_each(funs(set0 = c("0")), 4:6)
  • 如果你宁愿指定变量名而不是列号,mutate_each(funs(set0 = c("0")), one_of(c("Acebutol", "Bayer", "Oxaprozin")))mutate_each 行怎么样?
  • 复制和绑定行之前传播,你不必担心有多少药物。
【解决方案2】:

这样的?

TestNew <- Test22 %>% 
           group_by(Id) %>% 
           arrange(Date2) %>% 
           filter(row_number(Date2) == 1) %>% 
           bind_rows(Test2) %>% 
           arrange(Id, Date2)

【讨论】:

  • @SamThomas,bind_rows 函数抛出错误,表示找不到函数。我重新安装了 dplyr 包并尝试但仍然显示错误
  • @BridgeportByronTucker 您使用哪个版本的dplyr
  • @Pascal,我的 dplyr 版本是 0.3.0.2
  • @BridgeportByronTucker 如果可以的话,你真的应该升级 R 和你安装的包。
  • @SamThomas,这行得通,除了药物有一些非零值,没什么大不了的,酷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多