合并两个不同大小的数据帧

时间:2015-07-07 17:18:46

标签: r

我有两个数据框,有两列。一列用于数字数据的另一列日期。两个数据框具有不同的大小。我举一个例子说明我拥有的和我需要的东西。

这就是我所拥有的:

DF1
2015-01-02  0
2015-01-03  0
2015-01-04  0

DF2
2015-01-03  200

这就是我需要的:

DF1
2015-01-02  0
2015-01-03  200
2015-01-04  0

我尝试比较(比较功能)两个DF,但我没有解决方案。 也许这可以帮助你(甚至使功能更快),在两个DF中日期都是排序的。

有人可以帮助我吗?

非常感谢, Gobya

3 个答案:

答案 0 :(得分:1)

当两个数据框中存在匹配日期时(根据@ user295691评论),您不清楚如何选择要选择的行,因此我提供了两个选择选项在下面给出你指定的结果。

DF1 <- data.frame(date = c("2015-01-02", "2015-01-03", "2015-01-04"),
                  value = c(0, 0, 0), stringsAsFactors=FALSE)
DF2 <- data.frame(date = c("2015-01-03"), value = c(200), stringsAsFactors=FALSE)

DF1$source = "DF1"
DF2$source = "DF2"

library(dplyr)

# Choose the greatest value for each date
newDF = DF1 %>% bind_rows(DF2) %>%
  group_by(date) %>%
  filter(value == max(value))

# If there are more than two values for a given date, 
# choose the value(s) from DF2 for that date
newDF = DF1 %>% bind_rows(DF2) %>%
  group_by(date) %>%
  mutate(n=n()) %>%
  filter(ifelse(n>1, source=="DF2", source=="DF1")) %>%
  select(-n)

仅供参考,对于第二种方法,我认为以下方法可行,但它排除了日期= 2014-01-03的行。我不确定为什么会对任何出错的想法感兴趣:

DF1 %>% bind_rows(DF2) %>%
  group_by(date) %>%
  filter(ifelse(n() > 1, source=="DF2", source=="DF1"))

        date value source
1 2015-01-02     0    DF1
2 2015-01-04     0    DF1

答案 1 :(得分:0)

使用full_join()包中的dplyr

DF1 <- data.frame(date = c("2015-01-02", "2015-01-03", "2015-01-04"),
                  number = c(0, 0, 0))
DF2 <- data.frame(date = c("2015-01-03"), number = c(200))

DF3 <- full_join(DF1, DF2, by="date")

DF3$newColumn <- ifelse(is.na(DF3$number.y), DF3$number.x, DF3$number.y)

答案 2 :(得分:0)

newdf <- merge(DF1, DF2, by='V1', all=T)
newdf[,2][is.na(newdf[,2])] <- newdf[,3][!is.na(newdf[,3])]
newdf[-3]
#           V1 V2.x
# 1 2015-01-02    0
# 2 2015-01-03  200
# 3 2015-01-04    0