Mam dataframe (DF1) z kolumną "Partcipantid". Niektórzy uczestniczeni są błędne i powinny być zastąpione właściwym uczestnikiem. Mam kolejną dataframe (DF2), gdzie wszystkie identyfikatory uczestnika pojawiają się w kolumnach Cel_id do T4. Identyfikatory uczestnika w kolumnie "bramce_id" są poprawnymi identyfikatorami.
Teraz chcę zastąpić wszystkich uczestnictwa w DF1 ze wszystkimi uczestnictwami bramki od DF2.

To jest mój oryginalny Dataframe (DF1):

structure(list(Partcipant_ID = c("AA_SH_RA_91", "AA_SH_RA_91", 
"AB_BA_PR_93", "AB_BH_VI_90", "AB_BH_VI_90", "AB_SA_TA_91", "AJ_BO_RA_92", 
"AJ_BO_RA_92", "AK_SH_HA_91", "AL_EN_RA_95", "AL_MA_RA_95", "AL_SH_BA_99", 
"AM_BO_AB_49", "AM_BO_AB_94", "AM_BO_AB_94", "AM_BO_AB_94", "AN_JA_AN_91", 
"AN_KL_GE_11", "AN_KL_WO_91", "AN_MA_DI_95", "AN_MA_DI_95", "AN_SE_RA_95", 
"AN_SE_RA_95", "AN_SI_RA_97", "AN_SO_PU_94", "AN_SU_RA_91", "AR_BO_RA_92", 
"AR_KA_VI_94", "AR_KA_VI_94", "AS_AR_SO_90", "AS_AR_SU_95", "AS_KU_SO_90", 
"AS_MO_AS_97", "AW_SI_OJ_97", "AW_SI_OJ_97", "AY_CH_SU_97", "BH_BE_LD_84", 
"BH_BE_LI_83", "BH_BE_LI_83", "BH_BE_LI_84", "BH_KO_SA_87", "BH_PE_AB_89", 
"BH_YA_SA_87", "BI_CH_PR_94", "BI_CH_PR_94"), Start_T2 = structure(c(NA, 
NA, NA, NA, 1579514871, 1576658745, NA, 1579098225, NA, NA, 1576663067, 
1576844759, NA, 1577330639, NA, NA, 1576693930, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, 1577718380, 1577718380, 1577454467, NA, 
NA, 1576352237, NA, NA, NA, NA, 1576420656, 1576420656, NA, NA, 
1578031772, 1576872938, NA, NA), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), End_T2 = structure(c(NA, NA, NA, NA, 1579515709, 
1576660469, NA, 1579098989, NA, NA, 1576693776, 1576845312, NA, 
1577331721, NA, NA, 1576694799, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 1577719049, 1577719049, 1577455167, NA, NA, 1576352397, 
NA, NA, NA, NA, 1576421607, 1576421607, NA, NA, 1578032408, 1576873875, 
NA, NA), class = c("POSIXct", "POSIXt"), tzone = "UTC")), row.names = c(NA, 
45L), class = "data.frame")

I to jest rama danych odniesienia (DF2):

structure(list(Goal_ID = c("AJ_BO_RA_92", "AL_EN_RA_95", "AM_BO_AB_49", 
"AS_KU_SO_90", "BH_BE_LI_84", "BH_YA_SA_87", "BI_CH_PR_94", "BI_CH_PR_94"
), T2 = c("AJ_BO_RA_92", "AL_MA_RA_95", "AM_BO_AB_94", "AS_AR_SO_90", 
"BH_BE_LI_83", "BH_YA_SA_87", "BI_NA_PR_94", "BI_NA_PR_94"), 
    T3 = c("AR_BO_RA_92", "AL_MA_RA_95", "AM_BO_AB_94", NA, "BH_BE_LI_83", 
    NA, "BI_CH_PR_94", "BI_CH_PR_94"), T4 = c("AJ_BO_RA_92", 
    "AL_MA_RA_95", "AM_BO_AB_94", NA, "BH_BE_LI_83", "BH_KO_SA_87", 
    "BI_CH_PR_94", "BI_CH_PR_94")), row.names = c(NA, -8L), class = c("tbl_df", 
"tbl", "data.frame"))

Na przykład w moim DF1 chcę

"AR_BO_RA_92" do wymiany "aj_bo_ra_92";
"Al_ma_ra_95" do wymiany "al_en_ra_95";
"Am_bo_ab_94" do wymiany "am_bo_ab_49"

I tak dalej...

Myślałem o użyciu String_replace i zacząłem od tego:

df1$Partcipant_ID <- str_replace(df1$Partcipant_ID, "AR_BO_RA_92", "AJ_BO_RA_92")

Ale to oczywiście bardzo niedźwięczność, ponieważ mam tak wiele zamienników i byłoby miło korzystać z moich ramek danych referencyjnych. Po prostu nie mogę tego zrozumieć.
Mam nadzieję, że to zrozumiałe. Zapytaj, czy potrzebujesz dodatkowych informacji.

Dziękuję już bardzo!

r
1
Ane 12 marzec 2020, 18:14

2 odpowiedzi

Najlepsza odpowiedź

Możesz użyć match, aby znaleźć, gdzie znajduje się ciąg, który znajduje się i wymienić te, które zostały znalezione i nie są NA jak:

i <- match(df1$Partcipant_ID, unlist(df2[-1])) %% nrow(df2)
j <- !is.na(i)
df1$Partcipant_ID[j] <- df2$Goal_ID[i[j]]
df1$Partcipant_ID
# [1] "AA_SH_RA_91" "AA_SH_RA_91" "AB_BA_PR_93" "AB_BH_VI_90" "AB_BH_VI_90"
# [6] "AB_SA_TA_91" "AJ_BO_RA_92" "AJ_BO_RA_92" "AK_SH_HA_91" "AL_EN_RA_95"
#[11] "AL_MA_RA_95" "AL_SH_BA_99" "AM_BO_AB_49" "AM_BO_AB_94" "AM_BO_AB_94"
#[16] "AM_BO_AB_94" "AN_JA_AN_91" "AN_KL_GE_11" "AN_KL_WO_91" "AN_MA_DI_95"
#[21] "AN_MA_DI_95" "AN_SE_RA_95" "AN_SE_RA_95" "AN_SI_RA_97" "AN_SO_PU_94"
#[26] "AN_SU_RA_91" "AR_BO_RA_92" "AR_KA_VI_94" "AR_KA_VI_94" "AS_AR_SO_90"
#[31] "AS_AR_SU_95" "AS_KU_SO_90" "AS_MO_AS_97" "AW_SI_OJ_97" "AW_SI_OJ_97"
#[36] "AY_CH_SU_97" "BH_BE_LD_84" "BH_BE_LI_83" "BH_BE_LI_83" "BH_BE_LI_84"
#[41] "BH_KO_SA_87" "BH_PE_AB_89" "BH_YA_SA_87" "BI_CH_PR_94" "BI_CH_PR_94"
1
GKi 12 marzec 2020, 15:35

Myślę, że to może działać. Utwórz prawdziwy tabelę wyszukiwania z kolumną poprawnych i nieprawidłowych kodów. To znaczy. Stack kolumny, a następnie dołącz kolejny DF3 do DF1 i użyj Couryce, aby utworzyć nową Part_id. Czyliłeś Uczestnik źle, co sprawiło, że czuję się bardziej ludzki I zawsze .

library(dplyr)

df3 <- df2[1:2] %>% 
  bind_rows(df2[c(1,3)] %>% rename(T2 = T3), 
            df2[c(1,4)] %>% rename(T2 = T4)) %>% 
  distinct()


df1 %>% 
  left_join(df3, by = c("Partcipant_ID" = "T2")) %>% 
  mutate(Goal_ID = coalesce(Goal_ID, Partcipant_ID)) %>% 
  select(Goal_ID, Partcipant_ID, Start_T2, End_T2)
0
hammoire 12 marzec 2020, 15:58