【问题标题】:How to add variable from one dataframe to another dataframe (several conditions)如何将变量从一个数据帧添加到另一个数据帧(几个条件)
【发布时间】:2019-04-09 03:28:35
【问题描述】:

我已经阅读了现有的主题,但我所阅读的内容都与我想做的事情不符。

数据框 1:新数据(摘录)

country year      sector    emissions
Austria 1990       Total    6.229223e+04
Austria 1990   Regulated    3.826440e+04
Austria 1990 Unregulated    2.402783e+04
Austria 1991       Total    6.589968e+04
Austria 1991   Regulated    3.931820e+04
Austria 1991 Unregulated    2.658148e+04

数据框 2:EUETS(摘录)

country         year  emissions
Austria         2005  164925659
Belgium         2005  282762153
Croatia         2005          0
Cyprus          2005   16021583
Czech Republic  2005  288986144
Denmark         2005  171815416
Estonia         2005   71336242

我想做什么:

  • 将EUETS$emissions 中的信息添加到新列newdata$EUETS
  • 此插入应基于国家和年份,并插入到 newdata$sector = "regulated" 所在国家和年份的行中
  • newdata$sector = "unregulated" 和 newdata$sector = "Total" 需要接收 NA 并且在任何情况下都不要接收 0
  • 如果EUETS$country和/或EUETS$year中没有对应信息,则NA应插入newdata$EUETS
  • 如果EUETS$emissions 中有信息,但在newdata 中没有匹配的年份和/或国家,则应为该信息创建一个新行,如上填写来自EUETS 的值,但插入@ 987654337@ 在newdata$emissions = Total 和newdata$unregulated 的新单元格中。

这应该是这样的:

country         year      sector    emissions     EUETS
Austria         1990       Total    6.229223e+04  NA
Austria         1990   Regulated    3.826440e+04  2516843
Austria         1990 Unregulated    2.402783e+04  NA
Austria         1991       Total    6.589968e+04  NA
Austria         1991   Regulated    3.931820e+04  446656
Austria         1991 Unregulated    2.658148e+04  NA
Liechtenstein   2005 Total          NA            NA
Liechtenstein   2005 Regulated      NA            654612641
Liechtenstein   2005 Unregulated    NA            NA

列支敦士登仅在 EUETS$country 中,在 newdata$country 中不存在,因此被添加到后一个数据框中。

这可能是几个问题/帖子合二为一,但我希望在这里提问是合适的。我自己尝试了一些东西,但没有成功,尤其是在将值填充到 newdata(国家和年份)的现有列中时。

感谢您在此任务的任何部分提供的帮助。

提前非常感谢!

北湖

【问题讨论】:

    标签: r dataframe merge conditional-statements


    【解决方案1】:

    首先,更改 EUETS 列名和扇区,使其最终显示:

    names(EUETS)[3] = "EUETS"
    EUETS$sector = "Regulated"
    

    确保您的原始扇区列是一个字符,而不是一个因素:

    newdata$sector = as.character(newdata$sector)
    

    合并数据

    result = merge(newdata, EUETS, all = TRUE)
    

    为了将无人代表的国家/地区添加回 EUETS,我不确定您要添加哪些 year 和 emissions 值,所以我暂时忽略它。但基本上你想再次使用merge。

    【讨论】:

    • 非常感谢您迄今为止的帮助。关于最后一点,我想将EUETS 中但未在newdata 中表示的国家和年份添加到newdata。因为newdata 没有newdata$emissions 或results$emissions 的值,所以我想填写NA。基本上,当涉及到results$emissions 时,两个数据框都应该合并。如果国家/地区也存在于newdata 中,则代码仅执行此操作(添加仅在EUETS 中的年份。
    • 一个具体的例子会让你清楚你想要什么。这是我不明白的:(1)“将这些行添加到newdata”与创建我们已经完成的结果不同吗?如果不是,那么我认为上面的解决方案已经做到了,看看result,看看你是否同意。来自任一数据框的所有国家/地区都在result...
    • (2) 如果您想将result 分开,但仍要返回并将这些国家/地区添加到newdata,那么请举一个具体的例子。这是一个好的开始:假设EUETS 有两行像这样:data.frame(country = c("Elbonia", "Elbonia"), year = c(2005, 2010), emissions = c(0, 12345)),而Elbonia 没有出现在newdata 中。我知道我们想要和country = "Elbonia" 到newdata,但我不知道...
    • (a) 我们要添加一行还是两行?我们是否也从EUTS 获取年份? (b) 这些新行的sector 应该是什么? "regulated",就像我们从 EUETS 中提取的其他数据一样,还是别的什么? (c) 您是否仍要对 EUETS 排放列进行相同的重命名,还是其他?
    • 我回答的最后一段可能具有误导性,导致了误解。很高兴我们找到了一个可行的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多