R: Заменить значения в фрейме данных на фрейм данных B на основе критериев - PullRequest
0 голосов
/ 08 июня 2018

Я сделал несколько уколов в R, но не нашел работоспособного / элегантного решения.

Я пытаюсь заменить значения в df_1

df_1

  Year   Event          Loss   Control
1    5 2000003      78652058       180
2    5 2000013     130063819       251
3    7 2000023     299725787       266
4    8 2000033    2916285664       160
5    6 2000333    3254545464       162

соответствующимизначения в df_2

df_2

  Year   Event_1       Loss1   Event_2   Loss2
1    5   2000003  35318435.6   2000013  323380
3    7   2000023   7152099.6         0       0
4    8   2000033    985406.7         0       0

Мне нужно сопоставить 'Event_1' в df_2 с 'Event' в df_1 на 'Year' и заменить 'Loss' в df_1 на 'Loss1' из df_2.То же самое нужно сделать для «Event_2» и «Loss2».«Event_1» и «Event_2» в каждом «Year» df_2 всегда будут уникальными и всегда будут содержаться в df_1.Если «Event_1» или «Event_2» равен 0, замен не должно быть.В df_1 будут экземпляры 'Year' и 'Event', которые не содержатся в df_2.

Update

Вывод должен быть следующим:

  Year   Event          Loss   Control
1    5 2000003    35318435.6       180
2    5 2000013        323380       251
3    7 2000023     7152099.6       266
4    8 2000033      985406.7       160
5    6 2000333    3254545464       162

«Потеря» в строке 1 df_1 заменяется на «Потеря1» из строки 1 df_2 как df_1 $ Event [1] = df_2 $ Event_1 [1] И df_1 $ Year [1] = df_2 $ Year [1].df_1 $ Loss [2] заменяется на df_2 $ Loss2 [1] как df_1 $ Event [2] = df_2 $ Event2 [1] И df_1 $ Year [2] = df_1 $ Year [1].df_2 $ Год будет уникальным в каждой строке.df_2 $ Event_1 и df_2 $ Event_2 в строке никогда не будут иметь одно и то же значение.

1 Ответ

0 голосов
/ 08 июня 2018

Я думаю, что это дает вам то, что вы хотите

within(df_1, {
  df2_loss1 <- df_2$Loss1[match(interaction(Event, Year), with(df_2, interaction(Event_1, Year)))]
  df2_loss2 <- df_2$Loss2[match(interaction(Event, Year), with(df_2, interaction(Event_2, Year)))]
  Loss <- case_when(
    !is.na(df2_loss1) & !df2_loss1 == 0 ~ as.numeric(df2_loss1),
    !is.na(df2_loss2) & !df2_loss2 == 0 ~ as.numeric(df2_loss2),
    TRUE ~ Loss
  )
  # rm(df2_loss1, df2_loss2)
})

Обратите внимание, что пример не содержит 0, поэтому это не проверяется.

...