我有一个大型数据框df1
,其中有许多观察结果,包括观察日期。每个日期有多个观察结果。我还有另一个数据框df2
,其中包含两个变量,一个日期和一个我要添加到df1
的新变量,我们称之为VarC
。我们可以假设df2
中每个日期只有一个观察值。
以下是一些简单的示例代码:
df1Date <- as.Date(c('2010-11-1', '2010-11-1', '2010-11-2', '2010-11-2', '2010-11-2', '2010-11-2'))
VarA <- c("Red", "Blue", "Green", "Yellow", "Orange", "Black")
VarB <- c(1, 2, 3, 4, 5, 6)
df1 <- data.frame(df1Date, VarA, VarB)
df2date <- as.Date(c('2010-11-1','2010-11-2'))
VarC <- c("Good Day", "Bad Day")
df2 <- data.frame(df2date, VarC)
我想找到一种在DayType
中添加新变量df1
的有效方法,该变量等于从VarC
中选择的df1
中选择的值。换句话说,我想在df1
中查看每个观察结果,在df1Date
中查找匹配df2date
的日期df2
,并附加VarC
的类似值{ {1}}到新变量df1
下的DayType
数据框。
我熟悉dplyr :: mutate函数,但我不知道如何正确地索引数据框以完成我想要做的事情。
新变量DayType
应如下所示:
DayType <- c("Good Day", "Good Day", "Bad Day", "Bad Day", "Bad Day", "Bad Day")
答案 0 :(得分:1)
只需使用left join()
库中的dplyr
方法:
df3 <- df1 %>% left_join(df2, by = c("df1Date" = "df2date"))
输出:
df3
df1Date VarA VarB VarC
1 2010-11-01 Red 1 Good Day
2 2010-11-01 Blue 2 Good Day
3 2010-11-02 Green 3 Bad Day
4 2010-11-02 Yellow 4 Bad Day
5 2010-11-02 Orange 5 Bad Day
6 2010-11-02 Black 6 Bad Day
答案 1 :(得分:1)
以下是使用merge
的基本R解决方案:
merge(df1, df2, by.x = "df1Date", by.y = "df2date");
# df1Date VarA VarB VarC
#1 2010-11-01 Red 1 Good Day
#2 2010-11-01 Blue 2 Good Day
#3 2010-11-02 Green 3 Bad Day
#4 2010-11-02 Yellow 4 Bad Day
#5 2010-11-02 Orange 5 Bad Day
#6 2010-11-02 Black 6 Bad Day
答案 2 :(得分:0)
由于OP
正在寻找获得结果的efficient
和fast
方式,因此我的建议是使用left_join
方法data.table
。
library(data.table)
setDT(df1)
setDT(df2)
#left_join in data.table way
df1[df2, on=.(df1Date = df2date)]
# df1Date VarA VarB VarC
# 1: 2010-11-01 Red 1 Good Day
# 2: 2010-11-01 Blue 2 Good Day
# 3: 2010-11-02 Green 3 Bad Day
# 4: 2010-11-02 Yellow 4 Bad Day
# 5: 2010-11-02 Orange 5 Bad Day
# 6: 2010-11-02 Black 6 Bad Day