r Заменить несколько строк в столбце фрейма данных несколькими строками из столбца другого фрейма данных. - PullRequest
1 голос
/ 12 марта 2020

У меня есть фрейм данных (df1) со столбцом "PartcipantID". Некоторые идентификаторы участника неверны и должны быть заменены на правильный идентификатор участника. У меня есть другой фрейм данных (df2), где все идентификаторы участников отображаются в столбцах Goal_ID - T4. Идентификаторы участника в столбце «Goal_ID» являются правильными.
Теперь я хочу заменить все идентификаторы участника в df1 на все идентификаторы участника Goal_ID из df2.

Это мой оригинальный фрейм данных (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")

И это фрейм опорных данных (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"))

Например, в моем df1 , Я хочу, чтобы

"AR_BO_RA_92" был заменен на "AJ_BO_RA_92";
"AL_MA_RA_95" заменен на "AL_EN_RA_95";
"AM_BO_AB_94" заменен на "AM_BO_AB_49"

и так далее ...

Я подумал об использовании string_replace и начал с этого:

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

Но это, конечно, очень неэффективно, потому что у меня так много замен, и это было бы неплохо использовать мой справочный фрейм данных. Я просто не могу понять это сам.
Надеюсь, это понятно. Пожалуйста, спросите, нужна ли вам дополнительная информация.

Большое вам спасибо уже!

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Вы можете использовать match, чтобы найти, где находится строка, и удалить те, которые были найдены и не NA, такие как:

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"
0 голосов
/ 12 марта 2020

Я думаю, это может сработать. Создайте таблицу истинного поиска с колонкой правильных и неправильных кодов. Т.е. сложите столбцы, затем присоедините последующие df3 к df1 и используйте coalesce для создания нового part_id. Вы неправильно написали участника, что заставило меня чувствовать себя более человечным. Я всегда делаю это.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...