我在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永远不会是相同的值。
答案 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,因此未对此进行测试。