我有以下数据集:
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
答案 0 :(得分:0)
为此,我们可以使用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
始终是第一个{{ 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