如何根据条件集将行添加到数据集?

时间:2019-04-04 21:23:33

标签: r na

我有以下数据集:

SELECT DISTINCT naam,voorletters, TO_CHAR(geb_datum,'dd-mm-yyyy') AS 
geboortedatum, b.spelersnr
FROM spelers s LEFT OUTER JOIN boetes b
 ON (s.spelersnr = b.spelersnr)
WHERE b.bedrag<75 OR b.bedrag IS null
ORDER BY b.spelersnr

个人最多可以接受7种治疗,但有些人最多可以接受5种治疗(例如下下personal_id = 2的示例)。我需要为每个个体添加新行,直到他们接受的最大治疗次数(例如,individual_id = 1最多7个,individual_id = 2最多5个),治疗= NA。我想要这样的东西:

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 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

2 个答案:

答案 0 :(得分:0)

为此,我们可以使用

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始终是第一个{{ 1}},无论它是否存在于记录中。但是我还是按照上面的样子保留了它,因为这似乎是一个更通用的解决方案。

答案 1 :(得分:0)

请考虑为所有可能的个人和治疗编号配对建立辅助数据框架,然后对原始数据集进行左联接合并。

by下,按个体拆分,以使用expand.grid个体 number < / em>。最后,do.call将组子集数据帧的列表绑定到一个单个最终数据帧: 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