Мы можем сделать complete
после группировки по 'pid'
library(dplyr)
library(tidyr)
datatest %>%
filter(time %in% c("W1", "W2", "W3")) %>%
group_by(pid) %>%
complete(time, nesting(dat, mut), fill = list(percent = 0)) %>%
ungroup
# A tibble: 18 x 5
# pid time dat mut percent
# <chr> <chr> <chr> <chr> <dbl>
# 1 1004-A W1 E17K NV 0.51
# 2 1004-A W1 R175C NV 0.19
# 3 1004-A W1 S752F NV 0.1
# 4 1004-A W1 V600E NV 1.02
# 5 1004-A W3 E17K NV 1.25
# 6 1004-A W3 R175C NV 0
# 7 1004-A W3 S752F NV 0
# 8 1004-A W3 V600E NV 0.79
# 9 1004-B W1 2V3290D NV 0.68
#10 1004-B W1 CAH1047R NV 0.2
#11 1004-B W1 TP53 noNV 0
#12 1004-B W3 2V3290D NV 0.49
#13 1004-B W3 CAH1047R NV 0
#14 1004-B W3 TP53 noNV 0.06
#15 1004-C W1 CAE545K NV 11.6
#16 1004-C W1 TERT NV 1.93
#17 1004-D W1 3M35 NV 0.19
#18 1004-D W1 CAN345K NV 20.6
Для обновленного набора данных
out <- datatest2 %>%
filter(time %in% c("W1", "W2", "W3")) %>%
group_by(pid) %>%
complete(time, nesting(dat, mut), fill = list(percent = 0)) %>%
ungroup %>%
as.data.frame
out %>%
filter(pid %in% head(unique(pid), 2))
# pid time dat mut percent
#1 1004-A W1 E17K NV 0.51
#2 1004-A W1 R175C NV 0.19
#3 1004-A W1 S752F NV 0.10
#4 1004-A W1 V600E NV 1.02
#5 1004-A W3 E17K NV 1.25
#6 1004-A W3 R175C NV 0.00
#7 1004-A W3 S752F NV 0.00
#8 1004-A W3 V600E NV 0.79
#9 1004-B W1 2V3290D NV 0.68
#10 1004-B W1 CAH1047R NV 0.20
#11 1004-B W1 TP53 noNV 0.00
#12 1004-B W3 2V3290D NV 0.49
#13 1004-B W3 CAH1047R NV 0.00
#14 1004-B W3 TP53 noNV 0.06
data
datatest <- structure(list(pid = c("1004-A", "1004-A", "1004-A", "1004-A",
"1004-A", "1004-A", "1004-B", "1004-B", "1004-B", "1004-B", "1004-C",
"1004-C", "1004-D", "1004-D"), time = c("W1", "W1", "W1", "W1",
"W3", "W3", "W1", "W1", "W3", "W3", "W1", "W1", "W1", "W1"),
mut = c("NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV",
"noNV", "NV", "NV", "NV", "NV"), percent = c(1.02, 0.51,
0.19, 0.1, 1.25, 0.79, 0.68, 0.2, 0.49, 0.06, 11.6, 1.93,
20.61, 0.19), dat = c("V600E", "E17K", "R175C", "S752F",
"E17K", "V600E", "2V3290D", "CAH1047R", "2V3290D", "TP53",
"CAE545K", "TERT", "CAN345K", "3M35")), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14"))
datatest2 <- structure(list(pid = c("1004-A", "1004-A", "1004-A", "1004-A",
"1004-A", "1004-A", "1004-B", "1004-B", "1004-B", "1004-B", "1004-C",
"1004-C", "1004-D", "1004-D", "1004-C", "1004-C", "1004-D", "1004-D",
"3005-A", "3005-A", "3005-A", "3005-A", "3005-A", "3005-A", "3005-A",
"3005-B", "3005-B", "3005-B", "3005-B", "3001-A", "3001-B", "3005-A",
"3005-A", "3005-A", "3005-A", "3005-A", "3005-A", "3005-A", "5001-A",
"5001-A", "5001-A", "5001-A", "5001-B", "5001-B", "5001-B", "5001-B",
"5001-B", "5001-B", "5001-B", "5001-B", "5001-B"), time = c("W1",
"W1", "W1", "W1", "W3", "W3", "W1", "W1", "W3", "W3", "W1", "W1",
"W1", "W1", "W1", "W1", "W1", "W1", "W23", "W23", "W23", "W23",
"W23", "W1", "W1", "W8", "W8", "W1", "W1", "W3", "W1", "W23",
"W23", "W23", "W23", "W23", "W1", "W1", "W1", "W1", "W3", "W3",
"W1", "W3", "W3", "W41", "W41", "W41", "W41", "W41", "W41"),
mut = c("NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV",
"noNV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV",
"NV", "NV", "NV", "noNV", "noNV", "noNV", "NV", "NV", "NV",
"NV", "NV", "noNV", "NV", "NV", "NV", "NV", "noNV", "noNV",
"noNV", "NV", "noNV", "NV", "noNV", "NV", "NV", "NV", "NV",
"NV", "NV", "NV", "noNV", "noNV"), percent = c(1.02, 0.51,
0.19, 0.1, 1.25, 0.79, 0.68, 0.2, 0.49, 0.06, 11.6, 1.93,
20.61, 0.19, 11.6, 1.93, 20.61, 0.19, 2.82, 2.79, 1.93, 0.26,
1.61, 0.07, 0.04, 0.47, 0.28, 24.89, 17.63, 0.55, 0.09, 2.82,
2.79, 1.93, 0.26, 1.61, 0.07, 0.04, 0.1, 13.32, 0.17, 13.24,
0.13, 0.24, 0.23, 0.95, 0.56, 0.07, 0.04, 0.23, 0.13), dat = c("V600E",
"E17K", "R175C", "S752F", "E17K", "V600E", "2V3290D", "CAH1047R",
"2V3290D", "TP53", "CAE545K", "TERT", "CAN345K", "3M35",
"CAE545K", "TERT", "CAN345K", "3M35", "139K", "R181C", "L536H",
"D538G", "3F392fs", "3F392fs", "1V247fs", "R282W", "CAH1047R",
"CAH1047R", "R282W", "R130Q", "1905fs", "139K", "R181C",
"L536H", "D538G", "3F392fs", "3F392fs", "1V247fs", "Q947*",
"E171fs", "D400N", "E171fs", "I200S", "TP53", "I200S", "R548C",
"Q947*", "D538G", "Y537S", "TK11", "E542_L544del")), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24",
"25", "26", "27", "28", "29", "30", "31", "34", "35", "36", "37",
"38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48",
"49", "50", "51", "52", "53"))