【问题标题】:R: Merge dataframes if multiple conditions fulfilledR:如果满足多个条件,则合并数据帧
【发布时间】:2016-10-06 03:32:12
【问题描述】:

我喜欢合并两个数据集(Generaldata、monthlyresults),但同时应该满足另一个条件(Startdate=colnames_of_monthlyresults)。

示例(请参阅问题末尾的代码):

一般数据列:代码;开始日期(例如 201601)

Code: 1,2,3
Startdate: 201601, 201511, 201512

Monthlyresults 列:代码;结果201201(例如5%);结果201202; ... ;结果2011604

Code: 1,2,3
Result201511: 0, 20 , 0 
Result201512: 6, 30, 5
Result201601: 8, 40, 10

期望的结果:代码; Result_at_startdate

Code:  1,2,3
Result_startdate: 8, 20, 5

我尝试分两步执行此操作: 首先,我将两个数据集与以下代码合并:

Testresults<- merge(x=Generaldata, y=Monthlyresults, by.y = "Code", by.x= "Code", 
                    all.x = TRUE, incomparables = NA)

因此,我收到了一个包含太多列的数据框(4 年内每个月的结果),但我只对每个人在开始日期(以及稍后结束日期)的结果感兴趣。 我怎么能做到这一点?

我尝试将这两个条件都包含在合并函数的 by= 元素中,但问题是我只需要引用结果数据集中的列名而不是行条目。 我也用 ifelse 函数尝试过,但是我遇到了格式不一样的问题。 startdate 列(“201601”)的条目不等于列名(“R201601”,因为列名不能以数字开头)。 在 Excel 中,我可能会结合 if 和 vlookup 函数来实现它,但我的数据集太大,无法使用 Excel。

我是 R 初学者,如果有人可以帮助我,我会非常高兴。

示例 R 代码:

Generaldata<- data.frame("Code"=c(1,2,3), "Startdate"= c(201511, 201512, 201601))

Monthlyresults<- data.frame ("Code"=c(1,2,3), "R201511"=c(0,20,0), "R201512"=c(6,30,5), "R201601"=c(8,40,10) )

Testresult <-merge(x=Generaldata, y=Monthlyresults, by.y = "Code", by.x= "Code", all.x = TRUE, incomparables = NA)
#Testresult have all columns of Monthlyresults, but I like to get only the result of every person at the startdate

Desired_result<- data.frame ("Code"=c(1,2,3), "Result_startdate"= c(8,20,5))
show(Desired_result)

【问题讨论】:

  • 请展示一些可重现的例子和预期的输出
  • @akrun:感谢您的提示。我添加了一个带有数字的示例。第 1 个人从 2016 年 1 月开始,值为 8。
  • 请查看at this link,了解如何创建可重现的示例。
  • @Sotos:感谢您提供有用的链接(我是 stackoverflow 的新手)。我在问题的末尾添加了一个可重现示例的 R 代码。

标签: r merge


【解决方案1】:

这是一个 dplyr/tidyr 答案

library(dplyr)
library(tidyr)
library(stringi)

Monthlyresults %>%
  gather(Startdate, value, -Code) %>%
  mutate(Startdate = 
           Startdate %>%
           stri_sub(2) %>%
           as.numeric) %>%
  right_join(Generaldata)

【讨论】:

  • 太棒了!它适用于我的测试数据。你能解释一下“stri_sub(2)”是什么吗?我真的不明白您如何引用结果列,因此无法将其应用于我的真实数据。非常感谢您的回答
  • 我尝试将您的代码应用于我的真实数据,但我只得到 NA。你知道为什么吗?加入者:c("Code", "Startdate") 警告消息:在 function_list[[k]](value) 中:强制引入的 NAs
  • 抱歉,stri_sub 是来自 stringi 的函数。我将其添加为库。它将子集以第二个字符开头的字符串。在这种情况下,它将删除 R 的
  • 我想知道在尝试将非数字转换为数字时是否引入了 NA。我转换为数字,因为您的一般数据中的开始日期是数字。
  • 感谢您的支持 :) 我解决了 NA 问题,现在一切正常。我的真实数据的列名格式不一样,调整后我没有 NA 值。对不起,我没有早点发现它。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
相关资源
最近更新 更多