我有一个包含许多观测数据的大型数据帧df1,其中包括观测日期。每个日期都有多个观察值。我还有另一个dataframe df2,它包含两个变量,一个是date,另一个是我想添加到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)我想找到一种有效的方法来在df1中添加一个新的变量DayType,它将等于从VarC中选择的一个值,该值与df1中的日期匹配。换句话说,我想遍历df1中的每个观察值,在df2中查找匹配df2date的日期df1Date,并在新变量DayType下将VarC的类似值附加到我的df1数据帧中。
我熟悉dplyr::mutate函数,但是我不知道如何适当地索引dataframe来完成我想要做的事情。
新变量DayType应该如下所示:
DayType <- c("Good Day", "Good Day", "Bad Day", "Bad Day", "Bad Day", "Bad Day") 发布于 2018-03-18 18:51:05
只需使用dplyr库中的left join()即可
方法:
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发布于 2018-03-18 18:56:08
这是一个使用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发布于 2018-03-18 18:56:40
由于OP正在寻找一种efficient和fast方法来获得结果,因此我的建议是使用使用data.table的left_join方法。
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 Dayhttps://stackoverflow.com/questions/49346937
复制相似问题