【问题标题】:R: Replace values in dataframe A with dataframe B based on criteriaR:根据标准将数据框 A 中的值替换为数据框 B
【发布时间】:2018-06-08 16:15:34
【问题描述】:

我在 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 中的“Event”匹配为“Year”,并将 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 行中的“Loss”被 df_2 第 1 行中的“Loss1”替换为 df_1$Event[1] = df_2$Event_1[1] AND df_1$Year[1] = df_2$Year[1] . df_1$Loss[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 永远不会是相同的值。

【问题讨论】:

  • 能否请您为示例数据添加您的预期输出?
  • df1 中有两个 Year=5 条目,因此根据年份请求替换到 df1 是不明确的。我想有人可能会猜测替换应该是按顺序进行的,但是我们不能保证一年内 df2 行中的项目数不会超过 df1 中的行数。看起来正确的方法可能是将 df2 重塑为长格式,将 Year 和 Event 作为联合“时间”变量,然后联合匹配 Year 和 Event。
  • 你的输出应该是什么?

标签: r dataframe replace find


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 2015-06-20
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2012-06-19
    • 2016-10-25
    • 2017-08-06
    • 2018-01-01
    相关资源
    最近更新 更多