R:根据条件将数据框A中的值替换为数据框B.

时间:2018-06-08 16:15:34

标签: r dataframe replace find

我在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

我需要将df_2中的'Event_1'与df_1中的'事件'匹配'年',并将df_1中的'Loss'替换为df_2中的'Loss1'。 “Event_2”和“Loss2”也需要做同样的事情。 df_2的每个'年'内的'Event_1'和'Event_2'将始终是唯一的,并且始终包含在df_1中。如果“Event_1”或“Event_2”为0,则不应进行替换。 df_1中将存在“年”和“事件”的实例,但不包含在df_2中。

更新

输出应如下:

  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

df_1第1行的'损失'被df_2第1行的'Loss1'替换为df_1 $ Event [1] = df_2 $ Event_1 [1] AND df_1 $ Year [1] = df_2 $ Year [1] 。 df_1 $损失[2]被替换为df_2 $ Loss2 [1]为df_1 $ Event [2] = df_2 $ Event2 [1] AND df_1 $ Year [2] = df_1 $ Year [1]。 df_2 $ Year在每一行都是唯一的。 df_2 $ Event_1和df_2 $一行中的Event_2永远不会是相同的值。

1 个答案:

答案 0 :(得分:0)

我认为这会让你得到你想要的东西

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,因此未对此进行测试。