如何通过索引R中另一个数据帧的行来在数据框中创建新变量

时间:2018-03-18 10:42:30

标签: r

我有一个大型数据框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")  

3 个答案:

答案 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正在寻找获得结果的efficientfast方式,因此我的建议是使用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