Заполните фрейм данных в R в соответствии с другим фреймом данных

#r #dataframe #dplyr

#r #фрейм данных #dplyr

Вопрос:

Привет, eveyron, мне понадобится помощь в R, чтобы заполнить столбцы внутри фрейма данных в соответствии с этим фреймом данных 1 :

   COL0 
    A 
    B 
    C 
    D 
 

Итак, идея в том, что у меня есть фрейм данных 2 :

 COL1 COL2 COL3 COL4 
SP1 A 3 OK 
SP2 A 7 OK 
SP3 A 9 OK 
SP1 B 2 OK 
SP3 B 3 OK 
SP4 B 1 OK
SP5 C 4 OK 
SP6 C 3 OK
SP2 C 8 OK
 

и я хотел бы добавить для каждого df1$COL0 (A, B, C и D) все возможные df2$COL1 , а затем заполнить df2$COL2 и df2$COL3 уже представить значения, но добавить df2$COL2=0 и df2$COL3=NONE , если не было df1$COL0 доступно в df2$COL1

У кого-нибудь есть идея для этого с помощью R-скрипта?

Вот ожидаемый результат

 COL1 COL2 COL3 COL4
SP1 A 3 OK
SP2 A 7 OK
SP3 A 9 OK 
SP4 A 0 NONE 
SP5 A 0 NONE 
SP6 A 0 NONE 
SP1 B 2 OK 
SP2 B 0 NONE 
SP3 B 3 OK 
SP4 B 1 OK
SP5 B 0 NONE 
SP6 B 0 NONE 
SP1 C 0 NONE 
SP2 C 3 OK
SP3 C 0 NONE 
SP4 C 0 NONE 
SP5 C 4 OK 
SP6 C 8 OK
SP1 D 0 NONE 
SP2 D 0 NONE 
SP3 D 0 NONE 
SP4 D 0 NONE 
SP5 D 0 NONE 
 

Вот данные :

 dput(df1)
structure(list(COL0 = c("A", "B", "C", "D", "E", "F", "G")), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -7L), spec = structure(list(
    cols = list(COL0 = structure(list(), class = c("collector_character", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1L), class = "col_spec"))


dput(df2)
structure(list(`COL1 COL2 COL3 COL4` = c("SP1 A 3 OK", "SP2 A 7 OK", 
"SP3 A 9 OK", "SP1 B 2 OK", "SP3 B 3 OK", "SP4 B 1 OK", "SP6 C 3 OK", 
"SP2 C 8 OK")), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -8L), spec = structure(list(cols = list(
    `COL1 COL2 COL3 COL4` = structure(list(), class = c("collector_character", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1L), class = "col_spec"))
 

SP6 D 0 НЕТ

Комментарии:

1. Проверьте dput df2 , имеет ли он только 1 столбец. Я думаю, что у него должно быть 4.

Ответ №1:

Вы можете использовать tidyr::complete :

 tidyr::complete(df, COL1, COL2 = df1$COL0, fill = list(COL3 = 0, COL4 = 'NONE'))

#  COL1  COL2   COL3 COL4 
#   <chr> <chr> <dbl> <chr>
# 1 SP1   A         3 OK   
# 2 SP1   B         2 OK   
# 3 SP1   C         0 NONE 
# 4 SP1   D         0 NONE 
# 5 SP2   A         7 OK   
# 6 SP2   B         0 NONE 
# 7 SP2   C         8 OK   
# 8 SP2   D         0 NONE 
# 9 SP3   A         9 OK   
#10 SP3   B         3 OK   
# … with 14 more rows
 

Комментарии:

1. Привет, спасибо, но «SP», num не будет работать с реальными данными, это был просто пример, но SP может быть, например, canis_lupus или homo_sapiens, вы видите?

2. @Grendel Как вы включаете SP5 в свой ожидаемый результат, когда у вас его нет в df1 or df2 ?