R语言 根据条件集向数据集添加行

ljsrvy3e  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(128)

我有以下数据集:

individual number treatment
1          1       AAAA
1          2       BBBB
1          3       CCCC
1          4       EEEE
1          5       XXXX
1          7       WWWW
2          2       EEEE
2          3       AAAA
2          5       RRRR

个人可以采取不同的治疗方法。我需要为每个人添加新的行,直到他们接受的最大治疗次数(例如individual_id=1至7,individual_id=2至5),治疗= NA。我想要这样的东西:

individual_id number treatment
    1              1       AAAA
    1              2       BBBB
    1              3       CCCC
    1              4       EEEE
    1              5       XXXX
    1              6       NA
    1              7       WWWW
    2              1       NA
    2              2       EEEE
    2              3       AAAA
    2              4       NA
    2              5       RRRR
piv4azn7

piv4azn71#

考虑为所有可能的个体和治疗编号配对构建辅助数据框,然后使用原始数据集运行左连接合并。
下面的byindividual 进行拆分,以使用expand.grid迭代构建 Dataframe ,用于 individualnumber 的所有成对组合。最后,do.call将组子集 Dataframe 的列表绑定到单个最终 Dataframe 中:fill_df

fill_df <- do.call(rbind, by(df, df$individual, function(sub) 
                                expand.grid(individual = unique(sub$individual),
                                            number = 1:max(sub$number))
                          )
                  )

final_df <- merge(fill_df, df, all.x=TRUE)
final_df

#    individual number treatment
# 1           1      1      AAAA
# 2           1      2      BBBB
# 3           1      3      CCCC
# 4           1      4      EEEE
# 5           1      5      XXXX
# 6           1      6      <NA>
# 7           1      7      WWWW
# 8           2      1      EEEE
# 9           2      2      <NA>
# 10          2      3      AAAA
# 11          2      4      <NA>
# 12          2      5      RRRR
cngwdvgl

cngwdvgl2#

我们可以使用tidyverse来实现:

library(tidyverse)

df %>% 
  group_by(individual) %>% 
  complete(nesting(individual), number = seq(min(number), max(number), 1))

# # A tibble: 12 x 3
# # Groups:   individual [2]
#   individual number treatment
#        <int>  <dbl>     <fct>    
# 1          1      1      AAAA     
# 2          1      2      BBBB     
# 3          1      3      CCCC     
# 4          1      4      EEEE     
# 5          1      5      XXXX     
# 6          1      6        NA       
# 7          1      7      WWWW     
# 8          2      1      EEEE     
# 9          2      2        NA       
# 10         2      3      AAAA     
# 11         2      4        NA       
# 12         2      5      RRRR

**注意:**对于此特定问题,基于下面的注解,number = seq(min(number), max(number), 1) ...应该是number = seq(1, max(number), 1),因为1总是第一个number,无论它是否存在于记录中。但我保留了它,因为这似乎是一个更一般的解决方案。

相关问题