首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过索引R中另一个数据帧中的行来在数据帧中创建新变量

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

Stack Overflow用户
提问于 2018-03-18 18:42:30
回答 3查看 46关注 0票数 0

我有一个包含许多观测数据的大型数据帧df1,其中包括观测日期。每个日期都有多个观察值。我还有另一个dataframe df2,它包含两个变量,一个是date,另一个是我想添加到df1中的新变量,我们称之为VarC。我们可以假设在df2中每个日期只有一个观察值。

下面是一些简单的示例代码:

代码语言:javascript
运行
复制
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应该如下所示:

代码语言:javascript
运行
复制
DayType <- c("Good Day", "Good Day", "Bad Day", "Bad Day", "Bad Day", "Bad Day")  
EN

回答 3

Stack Overflow用户

发布于 2018-03-18 18:51:05

只需使用dplyr库中的left join()即可

方法:

代码语言:javascript
运行
复制
df3 <- df1 %>% left_join(df2, by = c("df1Date" = "df2date"))

输出:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2018-03-18 18:56:08

这是一个使用merge的基础R解决方案

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2018-03-18 18:56:40

由于OP正在寻找一种efficientfast方法来获得结果,因此我的建议是使用使用data.tableleft_join方法。

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49346937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档