我有两个数据框,有两列。一列用于数字数据的另一列日期。两个数据框具有不同的大小。我举一个例子说明我拥有的和我需要的东西。
这就是我所拥有的:
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
答案 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